標識符就是指變量、函數、屬性的名字,或者函數的參數。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