Bearv5 最近的时间轴更新
Bearv5

Bearv5

V2EX 第 408435 号会员,加入于 2019-05-03 02:06:59 +08:00
Bearv5 最近回复了
## Day05-Day10:
### 第四章-第五章( p072-p108 )
* `+` 二元操作符的操作数有至少一个的类型是字符串时会优先将操作数转换为字符串,其他情况会转换成数值。
* 递增和递减操作符期待左值操作数,而且操作符在操作数左侧时,会为操作数重新赋值递增 /减后的值,操作数在右侧时则只递增 /减,不重新赋值。
* 关于整数的二进制表示部分因为 JS 中较少用到,且涉及到一些计算机基础知识,故作者在书中建议读者跳过。
* 关系表达式 `==` 和 `===` 使用相同的标准检查两个值是否相同,但是 `==` 允许操作数转换类型,`===` 则不允许。
* `==` 被认为是一个程序设计上的隐患,所以在实践中尽量使用 `===`。
* 对象和其他类型不一样的一个地方是,在作为比较操作符的操作数时,对象是按引用比较,而不是按值来比较,简单一些来说,对象是在比较对象的名字,而不是赋给对象的值。
* NaN 不全等于 NaN ,因为 NaN 不等于任何其他值,也不等于其自身。
* `==` 操作符的操作数如果类型不同,则会优先转换操作数为数值类型再进行比较。
* 比较操作符只能比较数值和字符串类型,所有不是这两种类型的操作数都会被转换类型。
* 对象在作为比较操作符的操作数时使用偏数值算法转换类型。
* 比较操作符在比较字符串时比较的是“字母表顺序”即组成字符串的 16 位 Unicode 值的数值顺序。
* NaN 作为比较操作符的操作数(包括转换后的值)时,比较操作符返回 false 。
* JS 有许多方法可以更可靠的比较字符串。
* in 操作符期待左侧操作数为字符串、符号或者可以转换为字符串的值,期待右侧操作数为对象。如果左侧操作数是右侧对象的值则返回 true 。
* instanceof 操作符的原理涉及到原型链,书中提示会在 6.3.2 种详细讲解。
* `&&` `||` 操作符不止可以返回布尔值,也可以返回真假值。逻辑操作符右侧的操作数最好不要包含负效应,除非是有意为之。另外这两个操作符被翻译成“与”和“或”,我自己的翻译是“且”和“否则”,这样的翻译对我来说更容易记忆和理解。
* 书里提到了德摩根定律,看上去很像乘法的法则。
* 组合赋值操作符多数情况下符合 `(a op= b ) === (a = a op b)` (op 是操作符),但是左侧的表达式 a 只会被求值一次,右侧则是两次,这在表达式 a 中包含负效应时会有所区别。
* JS 的全局函数 `eval()` 可以对源代码字符串求值,但是因为有可能会在实际使用中造成安全漏洞,所以不建议使用,且实际项目中几乎使用不到。
* 三元操作符 `?:` 先对第一个操作符求值,如果求值结果为真值,则求值第二个操作符,如果求值结果为假值,则求值第三个操作符。这在某些使用 `if` 语句的情况下可以使用 `?:` 代替并简化 `if` 语句。
* `??` 操作符和 `||` 操作符类似,但是前者在它的第一个操作数为 `0` 、`-0` 、 `''` 、 `flase` 时,会求值为真值。
* `typeof` 操作符返回操作数类型。比较有趣的是,函数在 JS 中算是一种对象,但是用 `typeof` 操作符返回的是 ‘function’ 类型。
* `delete` 操作符可以删除其操作数指定的对象属性和数组元素。需要注意的是该操作符可以完全删除对象属性,但是在删除数组元素时会留下一个“坑”,使数组的元素个数不变,成为一个稀疏数组。
* `await` 操作符有关于异步编程,作者建议阅读 13 章时再详细了解。
* `void` 作者说是个没啥用的操作符,该操作符是个一元操作符,它求值自己的操作数但丢弃操作数的值并返回 undefined 。
* `,` 是个二元操作符,它会求值左右两侧的操作数,然后丢弃左侧操作数的值并返回右侧操作数的值。唯一比较常见的用法是在有多个循环变量的循环语句中。
* JS 中的表达式被称作短语,由短语组成并且可以引起某种负效应的句子被称作语句。某些自身就可以引起负效应的短语,诸如赋值、函数调用表达式被称做表达式语句。类似的还有声明语句。
* 可以使用 `{}` 将多个语句复合成一个语句块,用以放在任何期待一个语句的地方。而且在 `{}` 之后可以不使用 `;` 作为分隔符。
* `;` 可作为空语句使用。在期待一个语句的地方放置一个空语句。但是用处不大。
* 条件语句使用 `{}` 语句块,可以避免很多麻烦。
* `else if` 不是一个 JS 短语,它是在使用 if/else 嵌套中的一个编程惯例。
* `swich` 语句中 case 之后最好跟随没有负效应的表达式,最靠谱的做法是只写常量表达式。
* `break` (在函数中使用 `return`) 可以作为 `switch` 语句的“跑出”关键字,使解释器“跑出” `switch` 语句。
* JS 中有 5 种循环语句,分别是 `while` `do/while` `for` `for/of(及其变体 for/await)` `for/in`。
* I 、j 、k 是 `while` 循环语句最常见的计数器变量名,作者建议为了更好的阅读性可以起一个更具描述性的变量名。
* `for/of` 循环只可用于可迭代对象,不可对不可迭代对象使用。可以使用内建方法将不可迭代对象转换成数组等可迭代对象再对其使用 `for/of` 循环。
* JS 的循环语句在循环字符串时是逐个 Unicode 码点迭代的,这意味着占用两个 UTF-16 字符的字符串只会循环一次。
* `for/await` 涉及异步迭代器,作者建议到第 12 章和第 13 章时再详细了解。
* `for/in` 循环可以对任何对象使用。使用时 `in` 关键字右侧的对象属性名会赋值给 `in` 关键字左侧的变量。
* 使用`for/in` 循环语句的一个隐患是,有可能会枚举对象在原型链中继承的可枚举属性,这会导致一些意外的结果。所以尽可能的使用`for/of` 循环语句就可以避免这些麻烦。
* `continue` 和 `break` 是唯二使用语句标签的语句。语句标签可以是任何合法的非保留字 JS 标识符,并且其与变量、函数名不在一个命名空间,但是不可以在嵌套循环中重复命名语句标签的标识符。
P.s 差不多一个星期没有更新了,原本的计划是每天 20+ 页的速度,但是对初学者来说的确还是有些吃力。花了大量的时间在验证和实验书中的例子,但是这个过程十分有趣,因为控制台总是会实时得给我明确的反馈,这和画图刚好相反,设计是不期待反馈的,越好的设计师越是会使用方法和实际受众拉开距离。
## Day04:
### 第四章( p064-p071 )
* 对象创建表达式使用关键字 new 并调用一个构造函数来创建一个新的对象。
* 操作符有一元、二元、三元,这三种,其中比较有趣的是 delete 这种单词在 JS 中也是一个操作符。
* lvalue 即 left value 。书中提到这是一个古老的术语,虽然这个概念对编程工作没什么实际用处,但是这里似乎可以窥见计算机语言发展上的一些拼写语法,还挺有趣的。
* JS 中新加入的比如 `**` 和 `??` 操作符在优先级上没有十分明确的定义,所以和其他操作符混用时需要辅助使用 `()` 强制优先操作。
* 一元、三元、赋值和幂操作符具有右结合性,也就是在相同优先级条件下从右至左计算操作数的值。其他操作符的计算顺序和初中数学一致是在相同优先级条件下从左至右计算的。
* JS 始终严格按照从左到右的顺序对子表达式求值。
* JS 的所有数值都是浮点数,所以算数表达式求值可以得到小数点后的精度。

P.s. 看这一章像是回到了初中数学课,还是比较催眠的。
## Day03:
### 第三章-第四章( p048-p063 )
* 对象到原始值的转换算法有三种:偏字符串算法、偏数值算法、无偏好算法。且所有对象都继承了 `toString()` 和 `valueOf()` 两种方法来转换成原始值。作者在对象到原始值的转换这一小节建议跳过这一节,详细的转换方式会在之后的 14.4.7 节介绍。
* let 用来声明变量,const 用来声明常量。比较有趣的是,可以使用全大写+下划线的方式来声明常量,声明变量则使用常规的小驼峰,这样可以在引用时,清楚辨别变量和常量。
* 所有在 `{}` 内使用 let 声明的变量和 const 常量都在这个代码块中具有块作用域(循环函数的循环体也适用这个规则),在 `{}` 之外声明的变量和常量具有全局作用域。使用 var 声明的变量不具有块作用域。
* var 需要注意的一个特性是具备作用域提升,可以在包含函数内部和变量声明之前引用变量,得到的值是 undefined 。
* 解构赋值可以将数组或对象字面量的语法用在变量名上,所赋的值用相同的语法写成,可以快捷得为多个变量赋值。
* 表达式是一个可以被求值并产生一个值的 JS 短语。
* 属性访问表达式 `a.b` 的左侧表达式的值假设为 null 、undefined ,这个时候表达式会抛出 TypeError 。为了避免这种情况可以使用条件式属性访问,同样的情况下使用条件式属性访问 `a?.b` 求值结果为 undefined 。

P.s. 大概了解犀牛书的结构了,书中有很多指向后面章节的内容介绍,用线性的方式看的确不需要每个定义都看懂,因为后面的章节才是主要描述某个知识的地方。除此之外,依然有很多需要主动检索的内容,之前大佬们推荐的 zh.javascript.info 派上很大用场,里面的释义通俗易懂,而且还很幽默。
## Day02:
### 第三章-第四章( p036-p047 )
* 使用操作符比较字符串时,比较的是字符串的 Unicode 16 位值序列。
* 字符串是只读的,使用方法调用字符串时会产生新的字符串。
* 模版字面量允许字符串横跨多行而无需转义,其中用 `${}` 包裹起来的表达式也会在求值后转换成字符串插入模板。
* 任何值都可以转换为布尔值。null 、undefined 、‘ ‘、0 、-0 、NaN ,这 6 个值的布尔值是 false ,所有其他值的布尔值为 true 。
* null 是程序级别的没有值; undefined 是系统级别的预定义全集常量,意义也是没有值。在使用中没有差别,但是在语义上可以用 null 表示预料中的没有值,这样在 undefined 出现时就可以更方便得区分是否是一个 bug 。
* Symbol 可以解决对象属性重名的问题,使用 `Symbol()` 会产生一个符号值,再次用相同的参数调用函数会产生另外一个完全不同的值。相当于把属性名装进了一个安全的福袋,即使福袋的外包装一样,内容也完全不同。
* 原始类型如 字符串、数值、布尔值、null 、undefined 的值不可修改,引用类型如对象的值可修改。
* JS 会根据上下文隐式转换提供的值,比较有趣的是 true 转换成数值是 1 ,null 和 false 则是 0 。

P.s. 花了些时间在 Codepen.io 上看别人的 demo (暂时只能看懂 html 、和 css 的部分)并且尝试书里的例子,很多基础知识不懂,几乎看一页就要花上一段时间来搜索相关概念。不过网上资料很丰富,立即就能找到想要答案。
@hertzry 设计没有学习的路径。路径在老板 /领导 /客户的脑海里。研究一下心理学或许可以总结出来一些靠谱的路径。
@thinkershare 谢谢大佬,我只能算是画了几年 web 的人,哈哈哈哈。
@thinkershare html 、css 倒是会的,我是 UI 转码。之前以为会点 html 、css 就差不多算 web 开发了,后来发现这俩不算编程。 : )
@happy61 你这是美剧硅谷的剧情吗 :)
# JavaScript 权威指南-学习笔记

## Day01:
### 第一章-第三章( p001-p035 )
* JavaScript 可以在包含 JavaScript 解释器的程序上运行,比如浏览器和 node.js 。
* 分号在 JS 中不是结尾必须的分隔符,但是使用分号可以避免很多不必要的意外错误。
* JS 总共有 8 种类型,分别是:字符串、数值、布尔值、符号、Null 、Undefined 、Biglnt 和对象。
* JS 的数值采用 64 位浮点表示法,这和大部分的编程语言一致,特点是无法精确表示十进制数值,但误差极小,完全可以满足日常使用。
* 数值字面量可以使用下划线分隔符来帮助确认位数。
* JS 使用 Unicode 字符集的 UTF -16 编码,因此字符串是无符号的 16 位值的序列,这意味着两个看上去相同的 JS 字符串有可能拥有不同的 Unicode 字符。
* 可以使用反斜杠( \ )来表示转义序列。比较有趣的用法是可以使用 ( \n ) 将字符串字面量换行。

p.s. 配合大佬们给的教程在推犀牛书的进度。我知道为什么犀牛书对新手不友好了,有很多计算机基础知识的兔子洞,书里是默认读者知道的,零基础理解起来的确费劲。
@vance123 @HugoChao @maigebaoer 谢谢呀,在线教程很棒,内容结构挺类似的,我可以一起跟着看。
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   4272 人在线   最高记录 5497   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 38ms · UTC 01:18 · PVG 09:18 · LAX 17:18 · JFK 20:18
Developed with CodeLauncher
♥ Do have faith in what you're doing.