标识符就是指变量、函数、属性的名字,或者函数的参数。javascript
// 在整个脚本顶部添加 "use strict"; // 在函数内部上方使用 function deSmoething() { "use strict"; // 函数体 }
break,do,instanceof,typeof,case,else,new,var,catch,finally,return,viod,continue,for,switch,while,debugger*,function,this,with,default,if,throw,delete,in,tryjava
function test() { message = 'hi'; //全局变量 } test() alert(message); // 'hi'
// 在使用bar声明变量但未对其加以初始化,这个变量的值就是undefined var message; alert(message == undefined); // true alert(message === undefined); // true // 下面这个变量并无声明 // var age alert(age); // 报错 // 对于还没有声明过的变量,只能执行一项操做,即便用typeof操做符检测其数据类型 // 对未经声明的变量使用delete不会致使错误,但这样没什么意义,并且在严格模式下确实会致使错误 var message; // var age alert(typeof message); // "undefined" alert(typeof age); // "undefined" // 二者都返回了undefined这个结果有其逻辑上的合理性。 // 由于虽然这两种变量从技术角度看有本质区别,但实际上不管对那种变量也不可能执行真正的操做
// 从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof 操做符检测null值时会返回"object"的缘由 var car = null; alert(typeof car); // "object" // 若是定义变量准备在未来用于保存对象,那么最好将该变量初始化为null而不是其余值 if (car != null) { ... } // 实际上 undefined值时派生自null值得,所以ECMA-262规定他们的相等性测试要返回true alert(null == undefined) // true
// 虽然Boolean类型的字面值只有2个,但ECMAScript中全部类型的值都有与这两个Boolean值等价的值。 // 任何非零的数字值(包括无穷大)返回true 0 和 NaN 返回false var message = "Hello world!"; Boolean(message); // true Boolean(0); // false Boolean(NaN); // false Boolean(Infinity) // true Boolean({}) // true Boolean(null) // false
// 八进制若是字面值中的数值超出了范围,那么前导零将被忽略,后面的数值将被当作十进制数值解析 var num1 = 070; // 八进制的56 var num2 = 079; // 无效的八进制数值 解析为79 var num3 = 08; // 无效的八进制数值 解析为8 // 八进制字面量在严格模式下是无效的,会致使支持该模式的JavaScript引擎抛出错误 // 十六进制字面值的前两位必须是0x 后跟任何十六进制数字 (0~9 和 A~F)其中字母不区分大小写 // 在进行算术计算时,全部八进制和十六进制表示的数值最终都将被转换成十进制数值 // 鉴于JavaScript中数值的保存方式,能够保存正零和负零,二者被认为相等 0 === -0 // true
Infinity + -Infinity // NaN var res = Number.MAX_VALUE + Number.MAX_VALUE; alert(isFinite(res)); // false
isNaN(NaN); // true isNaN(10); // false isNaN('10'); // false isNaN('blue'); // ture isNaN(true); // false 能够被转换成数值1 // isNaN()也适用于对象,在基于对象调用isNaN()函数时,会首先调用对象的valueOf()方法,而后肯定该方法返回的值是否能够转换为数值 // 若是不能,则基于整个返回值再调用toString()方法,再测试返回值 // 整个过程也是ECMAScript中内置函数和操做符的通常执行流程 var o = { valueOf: function() { return '10'; } } isNaN(o) // false 先返回'10' 再转换成数值10 var o2 = { valueOf: function() { return 'blue'; } } isNaN(o2) // ture 先返回'blue' 不能转换成数值
Number(true) // 1 Number(false) // 0 Number(null) // 0 Number(undefined) // NaN Number('') // 0 // 若是字符串中包含有效的十六进制格式,例如"0xf" 则将其转换为相同大小的十进制数值 // Number()也适用于对象,在基于对象调用isNaN()函数时,会首先调用对象的valueOf()方法,而后肯定该方法返回的值是否能够转换为数值 // 若是不能,则基于整个返回值再调用toString()方法,再测试返回值 // 因为Number()函数在转换字符串时比较复杂并且不够合理,所以在处理整数和浮点数的时候更一般的作法是用parseInt() 和 parseFloat()函数 Number(' 0.2') // 0.2 Number(' 02blue') // NaN parseInt(' 02blue') // 2 Number(' 0.2blue;') // NaN parseFloat(' 0.2blue;') // 0.2 // 在使用parseInt() 解析八进制字面量的字符串时 ECMAScript 3 和 5 存在分歧 // ECMAScript 3 认为56(八进制), ECMAScript 5 认为是70(十进制) var num = parseInt("070") // ECMAScript 5 中 parseInt()已经不具备解析八进制值得能力 即便在非严格模式下也是如此 // 能够为这个函数提供第二个参数避免歧义 var num = parseInt("0xAF", 16); // 175 // 实际上,若是有第二个参数,字符串能够不带“0x” var num1 = parseInt("AF", 16); // 175 var num2 = parseInt("AF"); // NaN // parseFloat() 从第一个字符开始解析,直到末尾,除非解析到碰见一个无效的浮点数为止 // 第一个小数点有效以后就无效 // parseFloat() 只能解析十进制值,所以它没有用的哥参数指定基数的用法,非十进制数值都返回0 // 若是字符串包含的是一个可解析为整数的数,会返回一个整数 parseFloat("1234blue"); // 1234 parseFloat("0xA"); // 0 parseFloat("22.24.5") // 22.24 parseFloat("0980.5"); // 980.5 parseFloat("3.125e"); // 31250000
var lang = "Java"; lang = lang + "Script"; /* * 实现这个操做的过程 * 首先建立一个能容纳10个字符的新字符串,而后再这个字符串中填充"Java" 和 "Script" * 最后销毁原来的字符串"Java"和字符串"Script",由于这个两个字符串都没用了 * 这个过程是在后台发生的,而这也是某些旧版本的浏览器 (1.0如下的Firefox IE6等)拼接字符串速度很慢的缘由所在 */
// toSring()能够传一个参数:输出数值的基数 默认十进制 var num = 10; num.toString(); // "10" num.toString(2); // "1010" num.toString(8); // "12" num.toString(10); // "10" num.toSring(16); // "a" null.toString(); // 报错 undefined.toString() // 报错 String(null); // "null" String(undefined); // "undefined"
// 三种写法等价 但不建议省略小括号 var o = {}; var o = new Object(); var o = new Object; o.constructor // ƒ Object() { [native code] } 就是Object()
Object 的每一个实例都具备下列属性和方法es6
// Baz.prototype, Bar.prototype, Foo.prototype 和 Object.prototype 在 baz 对象的原型链上: function Foo() {} function Bar() {} function Baz() {} Bar.prototype = Object.create(Foo.prototype); Baz.prototype = Object.create(Bar.prototype); var baz = new Baz(); console.log(Baz.prototype.isPrototypeOf(baz)); // true console.log(Bar.prototype.isPrototypeOf(baz)); // true console.log(Foo.prototype.isPrototypeOf(baz)); // true console.log(Object.prototype.isPrototypeOf(baz)); // true
var num1 = 2; var num2 = 20; var num3 = --num1 + num2; // 21 var num4 = num1 + num2; // 21 var num1 = 2; var num2 = 20; var num3 = num1-- + num2; // 22 var num4 = num1 + num2; // 21
var s1 = "2"; var s2 = "z"; var b = false; bar f = 1.1; var o = { varluOf: function() { return -1; } }; s1++; // 3 s2++; // NaN b++; // 1 f--; // 0.10000000000000009 浮点运算舍入错误致使 o--; // -2
负数一样二进制,但使用的格式是二进制补码express
var oldvalue = 64; var newvalue = oldvalue >> 5; // 二进制10 var oldvalue = 64; var newvalue = oldvalue >>> 5; // 二进制 10 var oldvalue = -64; var newvalue = oldvalue >>> 5; // 等于十进制的134217726
!"blue" // false !0 // true !NaN // true !null // true !undefined // true !"" // true !12345 // false
逻辑与 && 逻辑与是短路操做,若是第一个操做数可以决定结果,就不会对第二个操做数求值数组
var found = true; var result = (found && someUndefinedVariable); // 抛出错误 alert(result); // 这里不会执行 var found = false; var result = (found && someUndefindedVariable); // 不会发生错误 alert(result); // false
逻辑或 || 短路操做浏览器
var found = true; var result = (found || someUndefinedVariable); // 不会抛出错误 alert(result); // true var found = false; var result = (found || someUndefindedVariable); // 发生错误 alert(result); // 这里不会执行
var num1 = 5; var num2 = 10; var message = "the sum of 5 and 10 is " + num1 + num2; alert(message); // "the sum of 5 and 10 is 510" var message = "the sum of 5 and 10 is " + (num1 + num2); alert(message); // "the sum of 5 and 10 is 15" var res6 = 5 - null; // 5 null转为0
// 字母B的字符编码为66 而字母a的字符编码是97 // 若是要真正按照字母顺序比较字符串,就要相同大小 var result = "Brick" < "alphabet"; // true var result = "Brick".toLowerCase() < "alphabet".toLowerCase(); // false // "2" 字符编码是50,而"3"的字符编码是51 var result = "23" < "3"; // true var result = "23" > 3; // false var result = "a" < 3; // false 由于"a"被转换成了NaN var result = NaN < 3; // false var result = NaN >= 3; // false
相等和不相等 == , !=安全
全等和不全等 ===, !==函数
null == undefined // true null === undefined // false null 和 undefined是两个基本类型
variable = boolean_expression ? true_value : false_value;
var num1=1, num2=2, num3=3; var num = (5,3,2,4,0); // num的值为0
var i = 2; do { i += 2; console.log(i); } while (i < 2); // 打印 4
var i = 2; while (i < 2 ) { i += 2; console.log(i); } // 没有打印
// 无限循环 for (;;) { ... }
var i, j; loop1: for (i = 0; i < 3; i++) { //The first for statement is labeled "loop1" loop2: for (j = 0; j < 3; j++) { //The second for statement is labeled "loop2" if (i == 1 && j == 1) { continue loop1; } console.log("i = " + i + ", j = " + j); } } // Output is: // "i = 0, j = 0" // "i = 0, j = 1" // "i = 0, j = 2" // "i = 1, j = 0" // "i = 2, j = 0" // "i = 2, j = 1" // "i = 2, j = 2" // Notice how it skips both "i = 1, j = 1" and "i = 1, j = 2"
var itemsPassed = 0; var i, j; top: for (i = 0; i < items.length; i++){ for (j = 0; j < tests.length; j++){ if (!tests[j].pass(items[i])){ continue top; } } itemsPassed++; }
var i, j; loop1: for (i = 0; i < 3; i++) { //The first for statement is labeled "loop1" loop2: for (j = 0; j < 3; j++) { //The second for statement is labeled "loop2" if (i == 1 && j == 1) { break loop1; } console.log("i = " + i + ", j = " + j); } } // Output is: // "i = 0, j = 0" // "i = 0, j = 1" // "i = 0, j = 2" // "i = 1, j = 0" // Notice the difference with the previous continue example
var qs = location.search.substring(1); var hostName = location.hostname; var url = location.href; with(location) { var qs = search.substring(1); var hostName = hostname; var url = href; }
switch (i) { case 25: // 合并两种状况 case 35: alert("25 or 35"); break; case 45: alert("45"); break; default: alert("Other"); }
严格模式对函数有一些限制,不然会抛出错误oop