javascript学习笔记(1)

一、学习资料

https://wangdoc.com/javascript/index.html

二、学习笔记

1、入门篇

1)JavaScript 的变量名区分大小写
2)如果只是声明变量而没有赋值,则该变量的值是undefined。undefined是一个特殊的值,表示“无定义”。
3)JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量(不获取值),然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。
4)switch语句后面的表达式,与case语句后面的表示式比较运行结果时,采用的是严格相等运算符 ( === ),而不是相等运算符( == ),这意味着比较时不会发生类型转换。

2、数据类型

类型 typeof 运算后的结果
数值 number
NaN number
字符串 string
布尔值 boolean
函数 function
undefined undefined
对象 object
数组 object
null object

1)undefined == null,结果是true
2)null是一个表示“空”的对象,转为数值时为0;undefined是一个表示"此处无定义"的原始值,转为数值时为NaN。
3)调用函数时,应该提供的参数没有提供,该参数等于 undefined;对象没有赋值的属性等于 undefined;函数没有返回值时,默认返回 undefined
4)下面六个值被转为false,其他值都视为true:
undefined
null
false
0
NaN
""或’’(空字符串)
5)注意,空数组([])和空对象({})对应的布尔值,都是true。
6)JavaScript 语言的底层根本没有整数,所有数字都是小数(64位浮点数)。

1 === 1.0 // true
0.1 + 0.2 === 0.3// false

7)数值精度emmmm…
8)JavaScript 提供Number对象的MAX_VALUE和MIN_VALUE属性,返回可以表示的具体的最大值和最小值。
9)默认情况下,JavaScript 内部会自动将八进制、十六进制、二进制转为十进制。
10)唯一有区别的场合是,+0或-0当作分母,返回的值是不相等的(是因为除以正零得到+Infinity,除以负零得到-Infinity,这两者是不相等的)。其余场合都是等价的。
11)

NaN === NaN // false
[NaN].indexOf(NaN) // -1
NaN + 32 // NaN
NaN - 32 // NaN
NaN * 32 // NaN
NaN / 32 // NaN

12)0除以0会得到NaN,而非0数值除以0,会返回Infinity。
13)Infinity大于一切数值(除了NaN),-Infinity小于一切数值(除了NaN);Infinity与NaN比较大小,总是返回false。
14)关于Infinity和NaN部分,及时查阅手册
15)parseInt方法,及时查阅手册:如果parseInt的参数不是字符串,则会先转为字符串再转换。
16)parseFloat方法,如果参数不是字符串,或者字符串的第一个字符不能转化为浮点数,则返回NaN。尤其值得注意,parseFloat会将空字符串转为NaN。
17)如果方括号中的数字超过字符串的长度,或者方括号中根本不是数字,则返回undefined。
18)字符串内部的单个字符无法改变和增删。
19)JavaScript 的单位字符长度固定为16位长度,即2个字节。
20)JavaScript 允许属性的“后绑定”,也就是说,你可以在任意时刻新增属性,没必要在定义对象的时候,就定义好属性。
21)Object.keys方法:查看一个对象本身的所有属性
22)执行delete某属性,返回true,不能保证该属性一定存在,也不能保证删掉了(可能是继承来的)…
23)判断属性是否存在:

var obj = { p: 1 };
'toString' in obj // true,继承

var obj = {};
if ('toString' in obj) {
  console.log(obj.hasOwnProperty('toString')) // false
}

24)for…in循环有两个使用注意点:
它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性。
它不仅遍历对象自身的属性,还遍历继承的属性。
25)注意,如果with区块内部有变量的赋值操作,必须是当前对象已经存在的属性,否则会创造一个当前作用域的全局变量。建议不使用。
26)如果同一个函数被多次声明,后面的声明就会覆盖前面的声明。
27)变量和函数名同名时,提升顺序是函数声明在前,变量声明在后。
28)函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域。
29)注意,如果函数内部修改的,不是参数对象的某个属性,而是替换掉整个参数,这时不会影响到原始值。(修改了地址映射)
30)由于在 JavaScript 语言中,只有函数内部的子函数才能读取内部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。
31)闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。闭包的另一个用处,是封装对象的私有属性和私有方法。
32)注意,外层函数每次运行,都会生成一个新的闭包,而这个闭包又会保留外层函数的内部变量,所以内存消耗很大。因此不能滥用闭包,否则会造成网页的性能问题。
33)立即执行的函数表达式IIFE,它的目的有两个:一是不必为函数命名,避免了污染全局变量;二是 IIFE 内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。
34)数组的数字键不需要连续,length属性的值总是比最大的那个整数键大1。
35)数组的length属性是可写的。如果人为设置一个小于当前成员个数的值,该数组的成员会自动减少到length设置的值。清空数组的一个有效方法,就是将length属性设为0。
36)值得注意的是,由于数组本质上是一种对象,所以可以为数组添加属性(非整数),但是这不影响length属性的值。
37)使用delete命令删除一个数组成员,会形成空位(读取时是undefined,注意区分空位和undefined的区别),并且不会影响length属性。使用length属性进行数组遍历,空位不会跳过。使用数组的forEach方法、for…in结构、以及Object.keys方法进行遍历,空位都会被跳过。
38)数组的slice方法可以将“类似数组的对象”变成真正的数组。

var arr = Array.prototype.slice.call(arrayLike);

3、运算符

1)对于非相等的比较,算法是先看两个运算子是否都是字符串,如果是的,就按照字典顺序比较(实际上是比较 Unicode 码点);否则,将两个运算子都转成数值,再比较数值的大小。
2)对象转换成原始类型的值,算法是先调用valueOf方法;如果返回的还是对象,再接着调用toString方法。
3)且运算符(&&):如果第一个运算子的布尔值为true,则返回第二个运算子的值(注意是值,不是布尔值);如果第一个运算子的布尔值为false,则直接返回第一个运算子的值,且不再对第二个运算子求值。或运算符(||)同理(或运算符常用于为一个变量设置默认值)。
4)位运算符只对整数起作用,如果一个运算子不是整数,会自动转为整数后再执行。
5)使用二进制否运算(两次)取整,是所有取整方法中最快的一种。
6)“异或运算”有一个特殊运用,连续对两个数a和b进行三次异或运算,a^=b; b^=a; a^=b;,可以互换它们的值。这意味着,使用“异或运算”可以在不引入临时变量的前提下,互换两个变量的值。


笔记比较少的地方说明看得比较粗略,未完待续…
javascript学习笔记(2)

你可能感兴趣的:(前端学习)