properties

“xxx”.length

属性名都是字符串
用 . 只能访问满足变量名规则的属性
用[“a b”]可以访问数字/特殊字符串形式的属性名

Properties that contain functions are generally called methods

Object

  1. let descriptions = {
  2. work: "Went to work",
  3. "touched tree": "Touched a tree"
  4. };

删除属性

  1. let obj = {a: 1, b: 2}
  2. delete obj.b
  3. // 与 obj.b = undefined 是不同的

in 操作符 , Object.keys(obj), Object.assign()

  1. Object.assign(obj, {a:1, b:2, c:3}) // 把一个对象的属性复制给另一个对象
  2. // {a: 1, b: 2, c: 3}
  3. Object.keys(obj)
  4. // (3) ["a", "b", "c"]
  5. "a" in obj
  6. // true

对象与基本类型的区别

  1. let a = "xxx"
  2. let b = "xxx"
  3. a === b
  4. // true
  5. let c = {a:1}
  6. let d = {a:1}
  7. c === d
  8. // false
  9. const score = {visitors: 0, home: 0};
  10. score.visitors = 1; // This is okay
  11. score = {visitors: 1, home: 1}; // This isn't allowed

简写

  1. let a = 1, b = [1,2,3]
  2. let c = {a,b} // 属性可简写变量名
  3. c
  4. // {a: 1, b: Array(3)}

Math.sqrt() 求平方根 square root

Array

array的includes方法

  1. let arr = ['a', 'b', 'c']
  2. arr.includes('a') // 判断数组是否包含这个值

of 遍历数组

  1. for (let i of arr) {
  2. console.log(i) // i是arr里的值
  3. }

indexOf和lastIndexOf

  1. console.log([1, 2, 3, 2, 1].indexOf(2));
  2. // → 1
  3. console.log([1, 2, 3, 2, 1].lastIndexOf(2));
  4. // → 3
  5. "one two three".indexOf("ee") // 字符串也有indexOf

slice(a,b) a和b都是索引,[a,b)半闭半开区间,注意b不是长度

  1. console.log([0, 1, 2, 3, 4].slice(2, 4));
  2. // → [2, 3]
  3. console.log([0, 1, 2, 3, 4].slice(2));
  4. // → [2, 3, 4]

concat

  1. arr.concat("x") // 不是数组会转为数组

其他

  1. /* trim */
  2. console.log(" okay \n ".trim());
  3. /* padStart */
  4. console.log(String(6).padStart(3, "0"));
  5. // → 006
  6. /* split和join */
  7. let sentence = "Secretarybirds specialize in stomping";
  8. let words = sentence.split(" "); // 生成数组
  9. console.log(words);
  10. // → ["Secretarybirds", "specialize", "in", "stomping"]
  11. console.log(words.join(". ")); // 数组转为字符串
  12. // → Secretarybirds. specialize. in. stomping

Rest parameters

  1. function fn(...numbers) {
  2. console.log(...numbers)
  3. console.log(numbers) // numbers是参数数组
  4. }
  5. fn(1,2,3,4)
  6. // 1 2 3 4
  7. // [1, 2, 3, 4]
  8. let a = [1, 2, 3, 4]
  9. fn(...a) // 把数组分解成独立的参数,等价于fn(1,2,3,4)

Math Object

  1. Math.max (maximum)
  2. Math.min (minimum)
  3. Math.sqrt (square root)
  4. Math.PI
  5. Math.random()
  6. Math.floor()
  7. Math.ceil()
  8. Math.round()
  9. Math.abs()

析构 destructuring

  1. // 数组
  2. function phi([n00, n01, n10, n11]) {
  3. return (n11 * n00 - n10 * n01) /
  4. Math.sqrt((n10 + n11) * (n00 + n01) *
  5. (n01 + n11) * (n00 + n10));
  6. }
  7. // 对象
  8. let {name} = {name: "Faraji", age: 23};
  9. console.log(name);
  10. // → Faraji

JSON

  1. // 格式
  2. {
  3. "squirrel": false,
  4. "events": ["work", "touched tree", "pizza", "running"]
  5. }
  6. /* JSON.stringify 和 JSON.parse */
  7. let string = JSON.stringify({squirrel: false,
  8. events: ["weekend"]});
  9. console.log(string);
  10. // → {"squirrel":false,"events":["weekend"]}
  11. console.log(JSON.parse(string).events);
  12. // → ["weekend"]

Exercises

1. sum(range(a,b))

  1. // Your code here.
  2. function range(start, end, step=1) {
  3. let arr = []
  4. if (step < 0) {
  5. for (let i = start; i >= end; i += step)
  6. arr.push(i)
  7. }else {
  8. for (let i = start; i <= end; i += step)
  9. arr.push(i)
  10. }
  11. return arr
  12. }
  13. function sum(arr) {
  14. let sum = 0
  15. for (let i of arr) {
  16. sum += i
  17. }
  18. return sum
  19. }
  20. console.log(range(1, 10));
  21. // → [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  22. console.log(range(5, 2, -1));
  23. // → [5, 4, 3, 2]
  24. console.log(sum(range(1, 10)));
  25. // → 55

2. arr.reverse()

  1. function reverseArray(arr) {
  2. let output = []
  3. let x = arr[0]
  4. while(x){
  5. output.push(arr.pop())
  6. x = arr[0]
  7. }
  8. return output
  9. }
  10. function reverseArrayInPlace(arr) {
  11. for(let i = 0; i<Math.floor(arr.length / 2); i++){
  12. let temp = arr[i]
  13. arr[i] = arr[arr.length - i -1]
  14. arr[arr.length - i -1] = temp
  15. }
  16. return arr
  17. }
  18. console.log(reverseArray(["A", "B", "C"]));
  19. // → ["C", "B", "A"];
  20. let arrayValue = [1, 2, 3, 4, 5];
  21. reverseArrayInPlace(arrayValue);
  22. console.log(arrayValue);
  23. // → [5, 4, 3, 2, 1]

3. list

  1. /*********** arrayToList **************/
  2. // 递归实现
  3. function arrayToList(arr){
  4. if (arr.length === 1){
  5. return {value:arr[0], rest:null}
  6. }else if (arr.length > 1){
  7. return {value:arr[0], rest:arrayToList(arr.slice(1))}
  8. }
  9. }
  10. // for循环实现
  11. function arrayToList(arr){
  12. let list = null
  13. for(let i = 0; i < arr.length; i++){
  14. list = {value:arr[i], rest:list}
  15. }
  16. return list
  17. }
  18. /*********** listToArray **************/
  19. function listToArray(list){
  20. if (list.rest === null) {
  21. return [list.value]
  22. } else {
  23. return [list.value].concat(listToArray(list.rest))
  24. }
  25. }
  26. function listToArray(list){
  27. let arr = []
  28. for(let node=list; node; node = node.rest){
  29. arr.push(node.value)
  30. }
  31. return arr
  32. }
  33. /*********** prepend **************/
  34. function prepend(value, list) {
  35. return {value:value, rest:list}
  36. }
  37. /*********** nth **************/
  38. function nth(list, number) {
  39. if(number === 0) {
  40. return list.value
  41. } else if (number > 0) {
  42. return nth(list.rest, number-1)
  43. }
  44. }
  45. function nth(list, number) {
  46. let node = list
  47. for (let i = 1; i <= number; i++){
  48. node = node.rest
  49. }
  50. return node.value
  51. }
  52. console.log(arrayToList([10, 20]));
  53. // → {value: 10, rest: {value: 20, rest: null}}
  54. console.log(listToArray(arrayToList([10, 20, 30])));
  55. // → [10, 20, 30]
  56. console.log(prepend(10, prepend(20, null)));
  57. // → {value: 10, rest: {value: 20, rest: null}}
  58. console.log(nth(arrayToList([10, 20, 30]), 1));
  59. // → 20

4. Deep comparison

  1. function deepEqual(a,b) {
  2. if (a === b) return true
  3. if (a==null || typeof a !== "object"
  4. || b==null || typeof b !== "object")
  5. return false
  6. let keysA = Object.keys(a), keysB = Object.keys(b)
  7. if (keysA.length !== keysB.length) return false
  8. for (let key of keysA) {
  9. if (!keysB.includes(key) || !deepEqual(a[key], b[key])) return false
  10. }
  11. return true
  12. }
  13. let obj = {here: {is: "an"}, object: 2};
  14. console.log(deepEqual(obj, obj));
  15. // → true
  16. console.log(deepEqual(obj, {here: 1, object: 2}));
  17. // → false
  18. console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
  19. // → true