JavaScript权威指南笔记

JavaScript权威指南(第6版) PDF中文版+英文版+源代码  下载地址:

最近每天工作之余看下js的细节部分,时间不是很多,所以看的进度也不会太快,写个博客监督自己每天都看下。

以前不知道的细节或者以前知道但是没注意过的地方都会记录下来,所以适合有一定基础的,不适合零基础新手。

---------------------------------------------------------国庆期间 开始--------------------------------------------------------- 

js中所有数字都是浮点数,比如5/2不是2,是2.5,0/0为NaN,如果想实现5/2=2可以采用5>>2=2

"1.23" == 1.23 会将字符串转换为数字

33 + '33' = '3333' 字符串和数字相加,会将数字转换成字符串

object == number|string  PS: new Number(123) == 123 或者 new String('123') == '123' 为true ,其他为false
见未知

字符串连接中,使用join比使用+=要快几十倍,比如: ["abc","def"].join("")

--------------------------------------16.10.10添加 开始----------------------------------

包装对象

var s = "hello"

alert(s.length) => 5

在JS定义中字符串s为原始值,那为什么会有length属性?

因为在JS中,只要引用了字符串s的属性,js就会调用new String(s)来转换成对象,这个对象继承了字符串的方法,并被用来处理属性的引用。一旦属性引用结束,这个对象就会销毁。

比如:

var s = "123"

s.len = 4;

alert(s.len); => undefined

这是因为第二行创建完临时对象以后,马上就被销毁了。所以第三行自然引用不到。

再看:

var s = "123"

s.length = 4;

alert(s.length); => 3

同样的,因为第二行创建的对象并进行赋值以后,马上就被销毁了,第三行创建的是一个新的对象,所以自然就是3了

同样的数字和布尔值也有Number()和Boolean()方法,但是null和undefined就没有。

见46页3.6

--------------------------------------16.10.10添加 结束----------------------------------


js 字符串,数值和布尔值都是不可变的
如:var s=“hello”
s.toUpperCase();
console.log(s)
输出s为hello而不是HELLO
因为函数返回的是一个新字符串,而本身是不会改变的。
见47页3.7

js类型转换表
见49页上

js中对象永远不相等,即使对象中的所有索引以及属性值都一样也不相等,同样两个单独的数组也是永远不相等
原因:对象为引用类型,对象的比较为引用的比较,当为同一个引用对象时才相同
也就是说
var a ={};
var b=a;
此时a===b为true。 
见47页底部

--------------------------------------16.10.10添加 开始----------------------------------

js中对象的toString/valueOf方法

对象转换到字符串是先toString后valueOf,转换到数字反之 

ps:没看出toString/valueOf方法有什么区别,有待深入了解(除了书本上写了Date的对象,toString返回一段时间字符串,valueOf方法返回时间戳)

var a = {x:1} => [object Object]

var a = ['1',2,'你好'] => "1,2,你好"  在元素之间添加逗号后合并成字符串返回

var a = function() { return 0 } =>  function() { return 0 }  返回赋值的定义

function a() {return 0} => function a() {return 0}  返回定义的字符串

/\d+/g => /\d+/g

见52页

--------------------------------------16.10.10添加 结束----------------------------------
变量作用域不受{}代码块限制,只受函数声明限制,函数体内声明的变量都被“提前”至函数体顶部,也就是说在函数体内任何地方定义的变量都可以在函数体内任意地方使用,只是有可能未赋值(如果使用在声明之前)

见57页3.10.1

附加:

所有全局变量都是window或Global的属性

函数声明会被提到范围作用域的顶端

变量声明被提到范围作用域的顶端

变量声明比函数声明优先级高,变量声明优于函数声明,如果两者同时存在,后被提升的函数声明会覆盖被提升的变量声明

变量赋值不会被提升,到执行行代码才开始赋值



1.声明的全局变量和2.未声明直接赋值产生的全局变量的不同之处。
1.不能用delete删除
2.可以用delete删除
见58页3.10.2
因为用户用var声明的变量不能用delete删除
见89页中上

.访问和[]访问的区别
.访问会直接查找.后的属性值
[]访问会计算括号内的表达式并转为字符串后进行访问
这个特点导致如果属性名称是一个保留字(ES3)或者包含空格和标点符号,或是一个数字(对数组来说),则必须使用方括号
见63页底部

运算符相关
见66页

js比较运算符,如果比较的两个操作数,有一个为NaN,那么总是返回false,NaN和任何值都不相等,包括它自己,所以判断x是否为NaN可以用x!==x来判断
见77页上方

eval()作用
1.定义别名后eval就是全局的,此时可以在函数内使用全局变量的值(即使函数内有同名变量)
见85页代码段
2.未知

function定义
1.var funcname = function(){;}函数定义表达式
2.function funcname(){;}函数声明语句
区别:1.同var声明变量一样,只有变量声明被提前到了作用域顶部,但是没有值
2.整体都被提前
见95页底部

52-54需要细看

else if并不是真正的js语句,只不过是多条if/else 语句连在一起时的一种惯用写法
见98页

使用switch的场景
所有分支都依赖同一个表达式的值时,重复计算多条if语句中的表达式非常浪费
见99页上

switch中case后面的表达式与switch后的表达式的值是用“===”进行判断
见99页中

default可以放在switch内任何地方
见101页上

5.5.4
for/in
for(var i in o)

每次会将循环到的o的值赋值给i

所以可以这样

var a = { x:1,y:2}

var an =[];

var i=0;

for(an[i++] in a);

来获取a中的所有属性

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/0c0315b1d5014578b6e4d7ccca03f611.html