MDN堪称web开发的百宝箱,最好看英文,中文可能翻译有误且有些难点没有翻译(太不负责任。。。)
1, 命名规范:
1
| _ / $ / 字母开头,包含_ / $ / 字母/数字,其他的均不可以。(不规范的属性名可以用object.[“propName”]获取,而不可以用object.propName来获取)
|
2, 声明:
1 2 3 4 5 6
| var — 无块级作用域 let(6) — 有块级作用域,同一个作用域重复定义变量报错,提前引用let声明会报错 const(6) —创建只读常量,块级作用域,不能在同一作用域内与函数名和变量名一样,const变量引用的对象值可以变,但只能引用这个对象,不可以给该变量赋其他值 undefined 数值环境下转换为NaN,而null为0。 声明提升: 引用之后var定义的函数不会引发异常,而是得到undefined值,即赋值是无法提升的,只提升声明。
|
3, 数据结构与类型:
1 2 3
| 六个基本类型 — String /Number/Null/Undefined/Boolean/Symbol(6 实例是唯一不变的) Object / Function Undefined在私有作用域内可以赋值,全局作用域是无法赋值的
|
4, 数据类型转换
1 2 3 4 5 6 7 8
| parseInt(String,radix)— IE8及以下020按八进制转换,IE9以上及其他浏览器按十进制转换 Number() — 严格转换,只要有一个无法转换字符,即返回NaN,忽略八进制的前导0,Number(“”)转换成0 String() — 将任意类型的值转换为Sirng类型,原始类型直接加””,对象返回”function...” Boolean() —将任意类型值转换为布尔值,(Null/Undefined/NaN/+_0/””转换为false),其他全部转换为true If 调用的是Boolean()判断 一个值为字符串,另一个值为非字符串,则后者转为字符串 对象转换时先调用valueOf(),然后调用toString(),[]结果为””,对象为”[object Object]” 对象在+前面时看做代码块,忽略值
|
5,转义: 字符串末尾加\可以实现换行,替换\n;
6,标签语句跳出循环:
1
| 循环声明出使用lable:来定义跳出位置,continue:继续执行lable
|
7,*异常处理:
1 2 3 4 5 6 7 8 9 10
| 可以throw出任何含有值得表达式 UserException(message){ this.message = message; this.name = “UserException” }; UserException.prototype.toString = function(){ return this.name+”:”+this.message } Catch到异常后可以访问异常对象 Finally{}中的返回值会屏蔽try catch中的返回值,作为整个捕获过程的返回值
|
8,函数:
1 2 3 4 5 6 7 8 9 10
| 值传递:参数为原始类型参数时,为值传递,改变参数值不会影响外部定义的值 引用传递:参数为引用类型时,改变引用对象的属性会影响外部定义的该对象 函数声明会提升:(只有function(){}的形式) 函数内部调用arguments.callee指向函数本身,即在递归中用arguments.callee()取代functionName(); 函数内部全局的this值(如serTimeout内调用this),可以通过赋值给另一个变量的方式来解决(var that = this,全局的this用that替代) 闭包:http://jibbering.com/faq/notes/closures/
|
9,函数参数:
1
| es6中新增了默认参数(function(a,b=1){})和剩余参数(function(first,...theArgs){})
|
10,URL编码解码:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 编码原因: 服务的解析参数时,是按&,=,符号进行解析key、value值得,为了避免在value值中也出现这些用来区分键值的特殊符号,就需要对键值进行编码。 encodeURI,encodeURIComponent:前者将整个url转码,后者用来转value值,eq: var parseUrlSearch = function() { var query= window.location.search.slice(1); var result = {}; query.split("&").forEach(function(part) { var item = part.split("="); result[item[0]] = decodeURIComponent(item[1]); }); return result; }
|
11,操作符:
1 2
| / : JavaScript中1/2===0.5 &, !,^,~ :JavaScript中的二进制操作符将操作数转换为二进制位,对应位取与或非等,奖结果的二进制数在转换为10进制作为结果
|
11.1,逻辑操作符:
1 2 3
| &&:如果expr1能转换为false,返回expr1;否则返回expr2; ||:如果expr1能转换为true,返回expr1;否则返回expr2; !:如果expr可以转换为true,则返回false,否则返回true;
|
11.2一元操作符:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| delete : 不能删除var 声明的变量(没用var声明的可以删除)以及内置函数的属性(内置函数是可以删除的)对变量和方法名没有影响,可以删除全局未用var声明的对象,删除Array的元素不影响长度 typeof: Typeof null—>Object, typeof (predefind object)—>function,typeof Math—>object void: return undefined. 立即执行的function 声明前加void强制使函数声明变为表达式,并可以执行;JavaScript:function():将返回值的内容覆盖当前的页面,用void(0)返回 in: 指对象属性或者数值下标,delete属性或者array[n]时,prop in Object/index in Array返回false instanceof: object instanceof constructor ,判断依据是该构造函数的prototype是否在该对象的原型链中,即调用Object.getPrototypeOf(onject)=== constructor.prototype. (字面量的string instanceof Sting/Object都是false)iframe框架中不用的环境导致instanceof 会出现问题,比如Array.prototype !== window.frames[0].Array,此时最好用Array.isArray();
|
9,操作符优先级:
1
| https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table
|
9,数字和日期:
1 2 3
| 数字分为二进制(binary),八进制(Octal),十进制(decimal),十六进制(hexadecimal) 0开头且下一位大于7解析为十进制数字,小于8解析为八进制数 0b/B开头且后面数字为0或者1为二进制数,否则报语法错误
|