js 采用的是 二進(jìn)制浮點(diǎn)數(shù), 在運(yùn)算符取值的時(shí)候是四舍五入
0.3 - 0.2 = 0.9999999999999999
字符串比大小其實(shí)比的是 ASCII 碼值, js 字符串是由 ASCII 值來表示 unicode
'two' > 'three' // 因?yàn)?tw 在 ASCII 表中的值 大于 th
合理的分號
var y = x + y
( a + b ).toString()
這段代碼會被編譯器編譯
var y = x + y( a + b ).toString()
很顯然這并不是我們想要的
null 和 undefined
null
是js中的關(guān)鍵字, 為特殊的對象. undefined
表示值未初始化, es5 之前 undefined
可讀可寫 , es5之后只可讀
typeof null // object
typeof undefined // undefined
js 采用的是詞法作用域, 變量提升(聲明提前)
es6 之前沒有塊級作用域, 只有函數(shù)作用域, 每一個(gè)函數(shù)會生成一個(gè) 作用域?qū)ο? 對象上記錄所有聲明屬性.
eval 函數(shù)
直接的eval
函數(shù)更改局部變量,間接的eval更改全局變量
var geval = eval
var x = 'global', y = 'global';
function f() {
var x = 'local';
eval("x += 'changed';");
return x;
}
function g() {
var y = 'local';
geval("y += 'changed';");
return y;
}
console.log(f(), x); // 更改了局部變量: 輸出 localchanged, global
console.log(g(), y); // 更改了全局變量: 輸出 local ; globalchanged;
prototype(原型鏈)
- 通過原型鏈的繼承
通過原型鏈直接繼承, 這種方式不用創(chuàng)建實(shí)力節(jié)省內(nèi)存,但是Dog 和 Animal 的
prototype 指向同一個(gè)對象,對 Dog.prototype 的修改會反應(yīng)在 Animal 上
這并不是我們想要的
function Animal() {
this.name = 'animal';
}
function Dog() {
this.age = 8;
}
Dog.prototype = Animal.prototype;
Dog.prototype.constructor = Dog;
Dog.prototype.sex = '男'
var animal = new Animal();
console.log(animal.sex) // 輸出 男
通過原型鏈間接繼承
function Animal() {
this.name = 'animal';
}
function Dog() {
this.age = 8;
}
Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;
var dog1 = new Dog();
var animal = new Animal();
參考 [阮一峰](http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html)
- 所有對象的原型最終指向null;
var obj = new Object;
obj.__proto__.__proto__ // null
查找自有屬性(非繼承來的)
hasOwnProperty (ES5)
通過
prototype
添加的屬性和方法都是可枚舉的,也就是for in
的時(shí)候會遍
歷出來(可以通過Object.defineProperty添加屬性)
,Object.keys()
會忽略繼 承的屬性in 做類型檢測的時(shí)候會包含繼承屬性
通過
__proto__
屬性可檢測對象原型,但是并不推薦,因?yàn)镮E沒有此屬 性,Object.prototype.isPrototypeOf()
可以檢測原型
只讀屬性
var obj = {};
Object.defineProperty(obj, "prop", {
value: "test",
writable: false
});
禁止類的擴(kuò)展
-
Object.preventExtensions
可以設(shè)置禁止添加任何屬性,但是可刪除原有屬性 -
Object.seal
不可配置屬性,但是可讀可寫 -
Object.freeze
只讀不可配置
同源策略
限制范圍
- 無法讀取非同源網(wǎng)頁的 Cookie粒竖、LocalStorage 和 IndexedDB(web端數(shù)據(jù)庫)
- 無法接觸非同源網(wǎng)頁的 DOM
- 無法向非同源地址發(fā)送 AJAX 請求(可以發(fā)送,但瀏覽器會拒絕接受響應(yīng))兴喂。
- 為了用戶安全,瀏覽器端的腳本語言不能修改和刪除本地文件(現(xiàn)在的
HTML5
中 chrome 實(shí)現(xiàn)了webkitRequestFileSystem
api, 可以自沙盒中操作文件, 其他瀏覽器并未測試)
不嚴(yán)格的同源策略
- 可以通過 document.domain 來設(shè)置同源性
-
Cross-Origin
實(shí)現(xiàn)跨域 (詳情請看 阮一峰) - h5 中的
window.postMessage
H5
- 應(yīng)用程序新增了應(yīng)用緩存,由緩存清單決定緩存
-
window.postMessage
頁面消息傳遞 -
web worker
從此以后js就不再是單線程了,web worker
線程不能訪問dom, 它是一個(gè)獨(dú)立的上下文 - IndexedDB 非關(guān)系型數(shù)據(jù)庫
- Blob (很強(qiáng)大, 具體使用參考 此鏈接)
- arrayBuffer