2 回答

TA貢獻1864條經驗 獲得超2個贊
正如我之前所說
Arguments對象確實是特殊的對象, 它就是這麼設計的
再次閱讀構造Arguments對象的步驟
7. 調用內部[[DefineOwnProperty]]方法 (也就是設置私有屬性方法)
調用參數為 ('length',{[[Value]]: len, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true})
這個對象的length是直接附上去的
可以這樣模擬這個過程
a = {} Object.defineProperty(a, 'length' ,{value : 0,writable : true ,enumerable : false ,configurable : true }) alert(a.length) alert(a.hasOwnProperty( 'length' )) |

TA貢獻1804條經驗 獲得超7個贊
沒什麼特別的, Arguments Object就是這麼設計的
在ECMA-262.pdf 10.6有詳細說明它是怎麼構造的
1. len = 參數的數量
2. obj = 新創建一個ECMAScript對象
..
4. 給obj的內部[[Class]]屬性設置為 'Arguments'
這個你可以通過alert({}.toString.call(arguments))查看
..
7. 調用內部[[DefineOwnProperty]]方法 (也就是設置私有屬性方法)
調用參數為 ('length',{[[Value]]: len, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true})
..
...
這就表明length是單純的直接賦值給Arguments Object的, 沒有什麼神秘的
你自己new Object, 沒有給它設置length屬性當然沒有了
添加回答
舉報