要点索引:

  • JSON
  • More ...
  • 练习

1、补:js字符串的表达方式有三种: "" 和 '' 没什么区别,唯一区别在于 "" 中写 "要转义字符,在 '' 中写 ' 要转义字符。最后一种是 `` ,允许 'xx = ${算式}' 的简写方式。

2、两种主要的访问对象属性的方式 —— 点号与 [ ]

[ ] 会获取 [ ] 中的计算后字符串,点号则不会。

必须用 [ ] 的场景是访问数组属性 x[1], 因为点号后不能跟数字。

3、js数组自带push和pop方法。

队列也可以很容易实现:

let todoList = [];
function remember(task) {todoList.push(task);
}
function getTask() {return todoList.shift();
}
// 紧急事件插入到队列前面
function rememberUrgently(task) {todoList.unshift(task);
}

4、对象的属性中,非有效引用名(例如包含空格↓)必须用字符串形式表达:

let descriptions = {work: "Went to work","touched tree": "Touched a tree"
};

且必须要用 [ ] 访问该属性:

descriptions["touched tree"]

5、js对象允许动态添加属性:

descriptions["another property"] = "new one";

如果已经存在就替换。点号也是可以的,但 [ ] 比较通用。

6、动态删除属性:

/** 可以把对象想象成一只章鱼,对象的属性想象成带着便签* 的章鱼触手,数组也是一种对象,typeof [];的结果是object* 所以数组是一种触手上的便签全为顺序数字的章鱼。*/
let octopuse = {tentacleA: 1,tentacleB: 2,tentacleC: 3
};console.log(octopuse.tentacleA);
// → 1
delete octopuse.tentacleA;
console.log(octopuse.tentacleA);
// → undefined
console.log('tentacleA' in octopuse);
// → false

用in来判断属性是否存在才是准确的,因为值本身可能为undefined

注意,delete删除是有后遗症的!并不会删除干净(会留引用)。所以能用filter尽量不用delete

【PS. in和includes貌似可以互相替换?】

7、列出对象的所有属性名:

console.log(Object.keys(octopuse));
// → ["tentacleB", "tentacleC"]

8、Object.assign:

let objectA = {a: 1, b: 2};
Object.assign(objectA, {b: 3, c: 4});
console.log(objectA);
// → {a: 1, b: 3, c: 4}

9、多个引用可以指向同一个对象,obj1==obj2比较的是引用的值(只有指向同一个对象才返回true),而不是对象的内容。

const obj只是引用的值不变,不能保证所指向对象的内容不变。

(上述两点都可以类比Java)

10、直接传入绑定(键值对):

let journal = [];function addEntry(events, squirrel) {journal.push({events, squirrel});
}

11、重写书上的示例(探究xxx变成松鼠的原因):

/*** getPhi返回变成松鼠和事件的* 相关性,返回的值为-1~1,-1表示* 负相关,1表示正相关,0表示毫无关系。* table表示一个二维表,用于统* 计下面四种事件发生的次数:* 1、不变松鼠,事件没发生00=0,* 2、不变松鼠,事件发生01=1,* 3、变成松鼠,事件没发生10=2,* 4、变成松鼠,事件发生11=3* 测试:* console.log(getPhi([76, 9, 4, 1]));* → 0.06859943405700354*/
const getPhi = (table) => {return (table[3] * table[0] - table[2] * table[1]) /Math.sqrt((table[2] + table[3]) *(table[0] + table[1]) *(table[1] + table[3]) *(table[0] + table[2]));
};/*** 获取特定事件对应的表格,测试:* console.log(getTable(JOURNAL, "pizza"));* → [76, 9, 4, 1]*/
const getTable = (JOURNAL, specificEvent) => {let result = [0, 0, 0, 0];for (let someday of JOURNAL) {let tableIndex = 0;if (someday.squirrel) tableIndex += 2;if (someday.events.includes(specificEvent)) tableIndex += 1;result[tableIndex]++;}return result;
};/*** 返回包括日志所记录的所有事件的字符串数组*/
const getAllEvents = (JOURNAL) => {let result = [];for (let x of JOURNAL) {for (let theEvent of x.events) {if (!result.includes(theEvent)) {result.push(theEvent);}}}return result;
};const main = () => {let allEvents = getAllEvents(JOURNAL);for (let specificEvent of allEvents) {let table = getTable(JOURNAL, specificEvent);console.log(specificEvent + ":", getPhi(table));}
};

数据:

let JOURNAL = [{"events": ["carrot", "exercise", "weekend"],"squirrel": false},{"events": ["bread", "pudding", "brushed teeth", "weekend", "touched tree"],"squirrel": false},{"events": ["carrot", "nachos", "brushed teeth", "cycling", "weekend"],"squirrel": false},{"events": ["brussel sprouts", "ice cream", "brushed teeth", "computer", "weekend"],"squirrel": false},{"events": ["potatoes", "candy", "brushed teeth", "exercise", "weekend", "dentist"],"squirrel": false},{"events": ["brussel sprouts", "pudding", "brushed teeth", "running", "weekend"],"squirrel": false},{"events": ["pizza", "brushed teeth", "computer", "work", "touched tree"],"squirrel": false},{"events": ["bread", "beer", "brushed teeth", "cycling", "work"],"squirrel": false},{"events": ["cauliflower", "brushed teeth", "work"],"squirrel": false},{"events": ["pizza", "brushed teeth", "cycling", "work"],"squirrel": false},{"events": ["lasagna", "nachos", "brushed teeth", "work"],"squirrel": false},{"events": ["brushed teeth", "weekend", "touched tree"],"squirrel": false},{"events": ["lettuce", "brushed teeth", "television", "weekend"],"squirrel": false},{"events": ["spaghetti", "brushed teeth", "work"],"squirrel": false},{"events": ["brushed teeth", "computer", "work"],"squirrel": false},{"events": ["lettuce", "nachos", "brushed teeth", "work"],"squirrel": false},{"events": ["carrot", "brushed teeth", "running", "work"],"squirrel": false},{"events": ["brushed teeth", "work"],"squirrel": false},{"events": ["cauliflower", "reading", "weekend"],"squirrel": false},{"events": ["bread", "brushed teeth", "weekend"],"squirrel": false},{"events": ["lasagna", "brushed teeth", "exercise", "work"],"squirrel": false},{"events": ["spaghetti", "brushed teeth", "reading", "work"],"squirrel": false},{"events": ["carrot", "ice cream", "brushed teeth", "television", "work"],"squirrel": false},{"events": ["spaghetti", "nachos", "work"],"squirrel": false},{"events": ["cauliflower", "ice cream", "brushed teeth", "cycling", "work"],"squirrel": false},{"events": ["spaghetti", "peanuts", "computer", "weekend"],"squirrel": true},{"events": ["potatoes", "ice cream", "brushed teeth", "computer", "weekend"],"squirrel": false},{"events": ["potatoes", "ice cream", "brushed teeth", "work"],"squirrel": false},{"events": ["peanuts", "brushed teeth", "running", "work"],"squirrel": false},{"events": ["potatoes", "exercise", "work"],"squirrel": false},{"events": ["pizza", "ice cream", "computer", "work"],"squirrel": false},{"events": ["lasagna", "ice cream", "work"],"squirrel": false},{"events": ["cauliflower", "candy", "reading", "weekend"],"squirrel": false},{"events": ["lasagna", "nachos", "brushed teeth", "running", "weekend"],"squirrel": false},{"events": ["potatoes", "brushed teeth", "work"],"squirrel": false},{"events": ["carrot", "work"],"squirrel": false},{"events": ["pizza", "beer", "work", "dentist"],"squirrel": false},{"events": ["lasagna", "pudding", "cycling", "work"],"squirrel": false},{"events": ["spaghetti", "brushed teeth", "reading", "work"],"squirrel": false},{"events": ["spaghetti", "pudding", "television", "weekend"],"squirrel": false},{"events": ["bread", "brushed teeth", "exercise", "weekend"],"squirrel": false},{"events": ["lasagna", "peanuts", "work"],"squirrel": true},{"events": ["pizza", "work"],"squirrel": false},{"events": ["potatoes", "exercise", "work"],"squirrel": false},{"events": ["brushed teeth", "exercise", "work"],"squirrel": false},{"events": ["spaghetti", "brushed teeth", "television", "work"],"squirrel": false},{"events": ["pizza", "cycling", "weekend"],"squirrel": false},{"events": ["carrot", "brushed teeth", "weekend"],"squirrel": false},{"events": ["carrot", "beer", "brushed teeth", "work"],"squirrel": false},{"events": ["pizza", "peanuts", "candy", "work"],"squirrel": true},{"events": ["carrot", "peanuts", "brushed teeth", "reading", "work"],"squirrel": false},{"events": ["potatoes", "peanuts", "brushed teeth", "work"],"squirrel": false},{"events": ["carrot", "nachos", "brushed teeth", "exercise", "work"],"squirrel": false},{"events": ["pizza", "peanuts", "brushed teeth", "television", "weekend"],"squirrel": false},{"events": ["lasagna", "brushed teeth", "cycling", "weekend"],"squirrel": false},{"events": ["cauliflower", "peanuts", "brushed teeth", "computer", "work", "touched tree"],"squirrel": false},{"events": ["lettuce", "brushed teeth", "television", "work"],"squirrel": false},{"events": ["potatoes", "brushed teeth", "computer", "work"],"squirrel": false},{"events": ["bread", "candy", "work"],"squirrel": false},{"events": ["potatoes", "nachos", "work"],"squirrel": false},{"events": ["carrot", "pudding", "brushed teeth", "weekend"],"squirrel": false},{"events": ["carrot", "brushed teeth", "exercise", "weekend", "touched tree"],"squirrel": false},{"events": ["brussel sprouts", "running", "work"],"squirrel": false},{"events": ["brushed teeth", "work"],"squirrel": false},{"events": ["lettuce", "brushed teeth", "running", "work"],"squirrel": false},{"events": ["candy", "brushed teeth", "work"],"squirrel": false},{"events": ["brussel sprouts", "brushed teeth", "computer", "work"],"squirrel": false},{"events": ["bread", "brushed teeth", "weekend"],"squirrel": false},{"events": ["cauliflower", "brushed teeth", "weekend"],"squirrel": false},{"events": ["spaghetti", "candy", "television", "work", "touched tree"],"squirrel": false},{"events": ["carrot", "pudding", "brushed teeth", "work"],"squirrel": false},{"events": ["lettuce", "brushed teeth", "work"],"squirrel": false},{"events": ["carrot", "ice cream", "brushed teeth", "cycling", "work"],"squirrel": false},{"events": ["pizza", "brushed teeth", "work"],"squirrel": false},{"events": ["spaghetti", "peanuts", "exercise", "weekend"],"squirrel": true},{"events": ["bread", "beer", "computer", "weekend", "touched tree"],"squirrel": false},{"events": ["brushed teeth", "running", "work"],"squirrel": false},{"events": ["lettuce", "peanuts", "brushed teeth", "work", "touched tree"],"squirrel": false},{"events": ["lasagna", "brushed teeth", "television", "work"],"squirrel": false},{"events": ["cauliflower", "brushed teeth", "running", "work"],"squirrel": false},{"events": ["carrot", "brushed teeth", "running", "work"],"squirrel": false},{"events": ["carrot", "reading", "weekend"],"squirrel": false},{"events": ["carrot", "peanuts", "reading", "weekend"],"squirrel": true},{"events": ["potatoes", "brushed teeth", "running", "work"],"squirrel": false},{"events": ["lasagna", "ice cream", "work", "touched tree"],"squirrel": false},{"events": ["cauliflower", "peanuts", "brushed teeth", "cycling", "work"],"squirrel": false},{"events": ["pizza", "brushed teeth", "running", "work"],"squirrel": false},{"events": ["lettuce", "brushed teeth", "work"],"squirrel": false},{"events": ["bread", "brushed teeth", "television", "weekend"],"squirrel": false},{"events": ["cauliflower", "peanuts", "brushed teeth", "weekend"],"squirrel": false}
];

View Code

12、重写getPhi

function phi([n00, n01, n10, n11]) {return (n11 * n00 - n10 * n01) /Math.sqrt((n10 + n11) * (n00 + n01) *(n01 + n11) * (n00 + n10));
}

13、JSON是方便在网络上传输的数据,详情直接阅读百度百科。它的格式规定是非常严格的:JSON的属性必须由双引号包围,JSON中不能有注释 ...

let obj = {a: 123,b: "456"
};console.log(obj);
// → {a: 123, b: "456"}

let string = JSON.stringify(obj);console.log(string);
// → {"a":123,"b":"456"}

let obj2 = JSON.parse(string);
console.log(obj2);
// → {a: 123, b: "456"}

console.log(obj == obj2);
// → false

PS. === 是精确比较,不会进行类型转换,== 会进行类型转换(例如 1 == '1' 是true),在类型确定相同的情况下可以用。

14、各种语言中的可变参数(java、python、c++、javascript)

15、More ...

常用数组方法

常用string方法

常用Math方法

大约在全文 2 /3 处

16、练习

① 实现range(a, b),返回[a, ... , b]。

(省略sum)

onst range = (start, end, step=1) => {let result = [];if (start <= end && step > 0) {for (let i = start; i <= end; i+=step) {result.push(i);}} else if (step < 0) {for (let i = start; i >= end; i+=step) {result.push(i);}        }return result;
};console.log(range(1, 10));
console.log(range(5, 2, -1));
console.log(range(5, 2, 1));
// → [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// → [5, 4, 3, 2]
// → []

- - -- - - - - - -        -- -  -- -  - -- - - -          -- -  -- - - -- - - - - -- - - -- --

② 字符串倒序

let x = ['A', 'b', 'C'];
console.log(x.reverse());
console.log(x);
// → ["C", "b", "A"]
// → ["C", "b", "A"]

const reverseArray = arr => {let result = [];for (let i = 0; i != arr.length; ++i) {result.unshift(arr[i]); // 进队
    }return result;
};console.log(reverseArray(x));
console.log(x);
// → ["A", "b", "C"]
// → ["C", "b", "A"]

const reverseArrayInPlace = arr => {let start = 0;let end = arr.length - 1;while (start < end) {let temp = arr[start];arr[start++] = arr[end];arr[end--] = temp;}
};console.log(reverseArrayInPlace(x));
console.log(x);
// → undefined
// → ["A", "b", "C"]

- - -- - - - - - -        -- -  -- -  - -- - - -          -- -  -- - - -- - - - - -- - - -- --

③ 单向链表

const arrayToList = arr => {// 空数组直接返回nullif(arr.length == 0) return null;let index = 0;let result = {value: arr[index++],rest: null    };// 数组元素数量为1在初始化后立刻返回结果if(arr.length == 1) return result;// 数组元素数量大于1继续添加元素到listlet next = result;while(index < arr.length) {next = next.rest = {value: arr[index],rest: null};index++;}return result;
};console.log(arrayToList([10, 20, 30]));
// → {value: 10, rest: {…}}

const listToArray = list => {let result = [];while (list.rest != null) {result.push(list.value);list = list.rest;}result.push(list.value);return result;
};console.log(listToArray(arrayToList([10, 20, 30])));
// → [10, 20, 30]

const prepend = (x, list) => {let result = {value: x,rest: list};return result;
};console.log(prepend(10, prepend(20, null)));
// → {value: 10, rest: {…}}

const nth = (list, x) => {for (let i = 0; i < x; ++i) {list = list.rest;}return list.value;
};console.log(nth(arrayToList([10, 20, 30]), 1));
// → 20

递归版本nth:

const nth = (list, x) => {if (x == 0) return list.value;return nth(list.rest, --x);
};

课本解法(简洁了一倍。。):

function arrayToList(array) {let list = null;for (let i = array.length - 1; i >= 0; i--) {list = {value: array[i], rest: list};}return list;
}function listToArray(list) {let array = [];for (let node = list; node; node = node.rest) {array.push(node.value);}return array;
}function prepend(value, list) {return {value, rest: list};
}function nth(list, n) {if (!list) return undefined;else if (n == 0) return list.value;else return nth(list.rest, n - 1);
}

- - -- - - - - - -        -- -  -- -  - -- - - -          -- -  -- - - -- - - - - -- - - -- --

④ 深度比较

const deepEqual = (a, b) => {let typeA = typeof a;let typeB = typeof b;// 类型不同直接返回falseif (typeA != typeB) return false;// 判断是不是可以直接比较的类型let comparedDirectly = ["boolean", "number", "string"];if (comparedDirectly.includes(typeA)) return a === b;// 先排除值为null的情况if (a == null && b == null) return true;if (a == null && b != null || a !=null && b == null) return false;// 递归判断if (typeA == "object") {let keyA = Object.keys(a);let keyB = Object.keys(b);if (keyA.length != keyB.length) return false;for (let k of keyA) {if (keyB.includes(k)) {return deepEqual(a[k], b[k]);} else {return false;}}}// 其它情况一律返回未定义return undefined;
};let obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
// → true
console.log(deepEqual(obj, {here: 1, object: 2}));
// → false
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// → true

课本解法:

function deepEqual(a, b) {if (a === b) return true;// null == null 的情况在 a === b 时已经过滤掉了。if (a == null || typeof a != "object" ||b == null || typeof b != "object") return false;let keysA = Object.keys(a), keysB = Object.keys(b);if (keysA.length != keysB.length) return false;for (let key of keysA) {if (!keysB.includes(key) || !deepEqual(a[key], b[key])) return false;}return true;
}

转载于:https://www.cnblogs.com/xkxf/p/9546554.html

Eloquent JavaScript #04# Objects and Arrays相关推荐

  1. Eloquent JavaScript 阅读笔记一

    2019独角兽企业重金招聘Python工程师标准>>> 开始阅读这本书籍,作者从计算打孔机开始讲起,看来半天快要睡着的时终于进入正题: JavaScript的基本数据类型: Ther ...

  2. Eloquent JavaScript 笔记 九: Regular Expressions(下)

    12. The replace method replace() 是String对象的一个方法. "papa".replace("p", "m&quo ...

  3. JavaScript 04 流程控制(循环)

    目录 流程控制(循环)思维导图 1 - 流程控制 1.1 流程控制概念 1.2 顺序流程控制 1.3 分支流程控制 1.4 三元表达式 1.5 switch分支流程控制 附上流程控制思维导图: 2 - ...

  4. 《Eloquent JavaScript 3rd》笔记

    前言篇 计算机是人思想的一部分,逻辑.秩序.规则-- 不常见的任务需要额外的编程才能解决. 机器很死板,无趣. 忍受机器后能享受到便利. 借鉴了自然界以及人类的模式到编程的设计上. 编程的规则原理语法 ...

  5. JavaScript 04 — Array Cardio Day 1

    实现效果 熟悉数组的各种方法:filter().map().sort().reduce(). <script> // Get your shorts on - this is an arr ...

  6. Eloquent JavaScript 笔记 十九:Node.js

    1. Background 可以略过. 2. Asynchronicity 讲同步和异步的基本原理,可以略过. 3. The Node Command 首先,访问 nodejs.org 网站,安装no ...

  7. Javascript 04 读取本地文件内容

    let fs = require('fs') const path = "E:\\test\\koukou.txt" console.log(path)const content ...

  8. react基础_React基础

    react基础 After all my teachings about React, be it online for a larger audience or on-site for compan ...

  9. Licia:最全最实用的 JavaScript 工具库

    前言 在业务开发过程中,我们经常会重复使用日期格式化.cookie 操作.模板.浏览器判断.类型判断等功能.为了避免不同项目之间进行复制粘贴,可以将这些常用的函数封装到一起并发布 npm 包.在将近三 ...

最新文章

  1. Spring Boot 2.0 多图片上传加回显
  2. BLE 配对后通信其中一方LTK丢失情况(转自襄坤在线)
  3. 06-密码学基础-混合密码系统
  4. 简单学习kali高级渗透测试思路方法
  5. Guava源码分析——Immutable Collections(4)
  6. 电脑qq浏览器怎么滚动截长图_电脑上如何滚动截屏长图?这样做最简单
  7. 字体大宝库:15款漂亮的艺术字体免费下载
  8. python编写群发软件编写_我帮公司财务写了个“群发工资条”的 Python 脚本!
  9. 串口ISP方式下载单片机程序设计
  10. 2017年苏大计算机考研872真题及解析
  11. Excel 生成均匀分布、正态分布随机数
  12. 十五、分布式相关理论
  13. origin中画双y轴
  14. Qt 一个简单的word文档编辑器
  15. iOS 获取网络时间
  16. 【数值预测案例】(6) LSTM、GRU 时间序列股票数据预测,附TensorFlow完整代码
  17. 巧夺天工的kfifo(修订版)
  18. 读相对论后的几点思考(2009年1月18日更新)
  19. 如何把电脑中mkv视频文件刻录成蓝光视频光盘
  20. 1111111111111111222222222

热门文章

  1. AutoCAD .Net 使用 DrawJig 来动态地移动、旋转、缩放多个图元
  2. 刘若英携丈夫现身杭州 谈及隐私变得“太难搞”(图)
  3. Avast 导致 VMware 虚拟机无法上网解决方法
  4. pycharm代码快速格式化Ctrl + Alt + L快捷键
  5. 祝你生日快乐 用计算机,祝自己生日快乐的短语 适合自己生日发的说说大全
  6. k3s 卸载_手把手实操教程!使用k3s运行轻量级VM
  7. ROS2机器人笔记21-02-23
  8. CDC在OnPaint函数中采用TextOut函数初始化静态文本框
  9. Linux 必学的 100+ 常用命令,你都会用吗?
  10. 海量案例!生成对抗网络(GAN)的18个绝妙应用