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 程序以阻塞方式在浏览器中运行的最长时间(秒); • 变量名的最大长度。