1.变量作用域
- Javascript的变量的scope是根据方法块来划分的(也就是说以function的一对大括号{ }来划分)。切记,是function块,而for、while、if块并不是作用域的划分标准。
- 当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回到全局变量的scope,而当全局变量遇上局部变量时,怎样使用全局变量呢?用window.globalVariableName。
- Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定实变量的作用域。也就是变量提升。
2.变量提升
- JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部。
3.严格模式
- strict模式,在JS代码中的首行写上:'use strict';
- 严格模式下,所有变量名没有前缀var的都会报错。
- 非严格模式下,没有var前缀下,变量会隐式得申明为全局变量。(虽然是这么说的,但是我的调试结果,有加var和没加var的scope是一样的。)
4.几大类型的判断
- string: typeof varname === "string";
- number: typeof varname==="number"(特别注意NaN)
- undefined:typeof varname==="undefined" 或varname===undefined(注意双引号)
- function: typeof varname==="function"或varname instanceof Function
- null: varname === null
- object: 对象的比较采用的内存地址值的比较(传说是这样的,具体等我看完犀牛书再说。)
- NaN: isNaN(varname);
注:这边的typeof 是一个函数,返回值是一个string字符串
5.关于IF判断语句注意点
- if中判断条件如果没有特别指定,比如用==,===,<,>这样的,一律采用Boolean转化。
- Boolean转化中,除了"",NaN,undefined,null,0,false这六个其他一律为ture。
注:要特别注意"null","0","NaN"这样的值为true。
6.类型转化的问题
- pareInt和pareFolat的转化规则:
1. 忽略字符串前面的空白字符,找到第一个非空白字符
2. 如果第一个字符不是-或者数字返回NaN
3. 如果是继续解析,直到非数值模式为止
4. 0开头会当做八进制,0x开头会当做十六进制,但是可以指定第二个参数指定基数.
例如:
parseInt('blue'); //NaN
parseInt('-23ABS'); // -23
parseInt('0xf1'); // 241
parseInt('101', 2); // 5 - "+"法操作符:
1.在两个操作数都是数字的时候,会做加法运算
2.两个参数都是字符串或在有一个参数是字符串的情况下会把另外一个参数转换为字符串做字符串拼接
3.在参数有对象的情况下会调用其valueOf或toString
4.在只有一个字符串参数的时候会尝试将其转换为数字
5.在只有一个数字参数的时候返回其正数值```
###7."短路"取值问题###
- 一般用于函数的参数取默认值,如下(0为默认值):
var s="name"||0;//s="name"
var s=undefined||0;//s=0;```
8."=="运算判断###
- 如果两个值类型相同,则执行严格相等的运算
- 如果两个值的类型不同
1.如果一个是null,一个是undefined,那么相等
2.如果一个是数字,一个是字符串,先将字符串转为数字,然后比较
3.如果一个值是true/false则将其转为1/0比较
4.如果一个值是对象,一个是数字或字符串,则尝试使用valueOf和toString转换后比较
5.其它就不相等了```
###9.其他要注意的点###
- 浮点数是不精确的(由计算机的原理导致),所以如果要用浮点数做比较,最好使用减法然后结果小于某个较小的小数。
- String中的trim()方法在IE9以下无法使用,建议自己写一个一样功能的函数绑定到string上。(例如:```String.prototype.fun1=function (){ console.log("successful")};```)
- 空数组和null的typeof 为"object"
- void运算符的作用是执行一个表达式,然后返回undefined。
- 逗号运算符用于对两个表达式求值,并返回后一个表达式的值。
- switch语句进行比较的时候是全等于(===)操作,不会发生类型转换,切条件可以是任意表达式,比如某函数返回值。
- with语句很少用到,作用是把代码的作用域设置到一个特定对象里。
###10.ES6的新点(关于基础的)###
- 引入新数据结构map,用法:var map=new map();
- 引入新数据结构set,用法:var set=new set();
- for ... of循环(与for in的区别只遍历集合自身的属性)。
- rest参数 接受函数中多余的参数,比函数中内置的arguments方便。(使用方式...rest)。
- 为了解决块级作用域,ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量。
- ES6标准引入了新的关键字const来定义常量,const与let都具有块级作用域。