簡體   English   中英

為什么javascript在傳遞給function.apply()或function.call()時會改變原始類型?

[英]Why does javascript change primitive types when passed into function.apply() or function.call()?

看來,當使用一個原語類型(字符串,號碼)作為this函數調用的對象(作為第一個參數要么function.call()或函數應用於())時,原始類型被提升到它的對象當量(例如,一個字符串變成一個字符串)。

為了顯示:

var f = function(x) { return [typeof(this), typeof(x)]; }  
var obj = '123'  
f.call(obj, obj)  
>>> ["object", "string"]  

也就是說,“this”成為一個對象(它是一個String對象,我已經檢查過),而第二個調用參數成為函數“f”的第一個參數,並且仍然是一個原始字符串。

對象都是 “123”,但微妙的東西不起作用(例如,它們在“==”方面相同,但在“===”方面則不相同)。

我在chrome和firefox中都注意到了這種行為,所以我假設它有一個特定的原因。 我搜索過,但沒有找到任何解釋。 我很感激任何解釋,希望通過某種方式鏈接到文檔,解釋有關此規則及其發生原因的規則。

這似乎是正確的行為。

http://bclary.com/2004/11/07/#a-15.3.4.4

Function.prototype.call - 被調用的函數作為此值傳遞給ToObject (thisArg)。

ToObject “根據以下內容將其參數轉換為Object類型的值”:

String - 創建一個新的String對象,其[[value]]屬性設置為字符串的值。

Javascript函數調用和Apply方法中的第一個參數確定必須在哪個上下文中運行所請求的函數。 所以這永遠是一個對象

為了說明這一點,請查看以下示例

function totest() 
{
    this.ff  = function(x) {
        this.test(x);
    };

    this.test = function(x) {
        alert(x);
    }

}

function totest1() 
{   
 this.test = function(x) {
    alert(x);
}

}

function fun() 
{
     var obj = new totest();
     var obj1 = new totest1();
     obj.ff('hi');  //Runs fine without any problem
     obj.ff.call(obj, 'sam') ;  //Runs fine without any problem
     obj.ff.call(this, 'sam');  //throws an error
     obj.ff.call(obj1, 'sam');  //will be executed in the context of totest1

}

obj.ff.call(this,'sam')拋出一個錯誤。 為什么

因為我們指定obj.ff方法要在fun(或這里的窗口)的上下文中執行,而不是在totest的上下文中。

obj.ff.call(obj1,'sam')告訴調用在totest1()的上下文中執行ff,並且它有效,因為它得到了方法測試。

所以這必須是對象。

並且調用方法中的剩余參數對於要執行的方法是真實的。 所以他們會從給定的值推斷出類型。

希望你現在能理解

短期和簡單的:第一個參數變成如果物體是一個原始類型的,因為,正如你指出的那樣,可能被提及this在被調用的函數。 由於this必須指向一個對象,運行時環境可以確保有實際上一個對象引用。 想想你將如何實現它,你可能會得出同樣的結論。 好問題。

PS:我很欣賞Ramesh的答案,這在技術上是說明性的,但是想為不耐煩的讀者添加一個答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM