js若是隻在引擎中運行,它會嚴格遵循而且能夠預測的,可是js幾乎都在宿主環境中運行,瀏覽器或者Node環境javascript
介紹了瀏覽器兼容性問題致使與官方規範的差別java
• 在非嚴格模式中容許八進制數值常量存在,如0123(即十進制的83)。 • window.escape(..) 和window.unescape(..) 讓你可以轉義(escape)和迴轉(unescape) 帶有% 分隔符的十六進制字符串。例如,window.escape( "? foo=97%&bar=3%" ) 的結果 爲"%3Ffoo%3D97%25%26bar%3D3%25"。 • String.prototype.substr 和String.prototype.substring 十分類似,除了前者的第二個 參數是結束位置索引(非自包含),後者的第二個參數是長度(須要包含的字符數)。
<!-- 和--> 是合法的單行註釋分隔符。 • String.prototype 中返回HTML 格式字符串的附加方法:anchor(..)、big(..)、 blink(..)、bold(..)、fixed(..)、fontcolor(..)、fontsize(..)、italics(..)、 link(..)、small(..)、strike(..) 和sub(..)。 以上內容在實際開發中不多使用,也不推薦,咱們更傾向於使用其餘的內建 DOM API 和自定義工具集。 • RegExp 擴展:RegExp.$1 .. RegExp.$9(匹配組) 和RegExp.lastMatch/RegExp["$&"](最 近匹配)。 • Function.prototype 附加方法:Function.prototype.arguments(別名爲arguments 對象) 和Function.caller(別名爲arguments.caller)。
常見的宿主對象,以下例子web
var a = document.createElement( "div" ); typeof a; // "object"--正如所料 Object.prototype.toString.call( a ); // "[object HTMLDivElement]" a.tagName; // "DIV"
須要注意宿主對象的行爲差別瀏覽器
• 沒法訪問正常的object 內建方法,如toString(); • 沒法寫覆蓋; • 包含一些預約義的只讀屬性; • 包含沒法將this 重載爲其餘對象的方法;
一個不太爲人所知的事實是:因爲瀏覽器演進的歷史遺留問題,在建立帶有id 屬性
的DOM 元素時也會建立同名的全局變量dom
<div id="foo"></div> if (typeof foo == "undefined") { oo = 42; // 永遠也不會運行 } console.log( foo ); // HTML元素
當頁面出現多個id同名時,咱們能夠直接使用該全局變量來獲取同id的HTMLCollectionecmascript
故意設置兩個id同名,固然編碼時不推薦,簡易保持惟一
函數
使用id做爲變量名來獲取同名DOM
工具
不要擴展原生原型,由於隨着規範發展,擴展的功能可能會被實現,使得擴展和規範衝突優化
必要的擴展建議做以下處理this
if (!Array.prototype.push) { // Netscape 4沒有Array.push Array.prototype.push = function(item){ this[this.length-1] = item; }; }
polyfill 能有效地爲不符合最新規範的老版本瀏覽器填補缺失的功能,讓你可以經過可靠的代碼來支持全部你想要支持的運行環境,shim/polyfill可以填充新的API,可是無法填充新的語法,咱們可使用bable來將新的語法轉換成舊的語法
保留字
下面列出一些已知的限制:
• 字符串常量中容許的最大字符數(並不是只是針對字符串值); • 能夠做爲參數傳遞到函數中的數據大小(也稱爲棧大小,以字節爲單位); • 函數聲明中的參數個數; • 未經優化的調用棧(例如遞歸)的最大層數,即函數調用鏈的最大長度; • JavaScript 程序以阻塞方式在瀏覽器中運行的最長時間(秒); • 變量名的最大長度。