成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

翻譯:Javascript原始值解析

yeyan1996 / 1017人閱讀

摘要:結(jié)論最后證明相對(duì)于對(duì)原始值賦值,給對(duì)象賦值是它的一個(gè)唯一優(yōu)勢(shì)。而且,原始值是不可變的,你不可能通過改變他們的屬性值來修改他們。而且,我認(rèn)為對(duì)原始值深刻的理解,以及當(dāng)使用他們的時(shí)候知道具體發(fā)生了什么是深入理解這門語言邁出重要的一步。

第一次翻譯,可能有很多地方不恰當(dāng),歡迎指正。

原文地址:http://javascriptweblog.wordpress.com/2010/09/27/the-secret-life-of-javascript-primitives/

你可能不知道,在javascript中,在使用string, number, 布爾類型這些原始值時(shí),都會(huì)遇到意想不到的問題。閱讀下文,來揭曉里面的秘密。

基礎(chǔ)介紹

對(duì)象就是各個(gè)屬性的集合,屬性可以是對(duì)一個(gè)對(duì)象的引用或是一個(gè)原始值,原始值是一個(gè)值,他們沒有屬性。

在 JS 里的五類原始類型是:undefined, null, boolean, string 和 number."其余"的類型都是對(duì)象.其中 boolean, string 和 number 原始類型可以被對(duì)應(yīng)的對(duì)象類型包裹.這些對(duì)象都應(yīng)該是 Boolean, String 和 Number 類的實(shí)例。

typeof true; //"boolean"
typeof Boolean(true); //"boolean"
typeof new Boolean(true); //"object"
typeof (new Boolean(true)).valueOf(); //"boolean"

typeof "abc"; //"string"
typeof String("abc"); //"string"
typeof new String("abc"); //"object"
typeof (new String("abc")).valueOf(); //"string"

typeof 123; //"number"
typeof Number(123); //"number"
typeof new Number(123); //"object"
typeof (new Number(123)).valueOf(); //"number"
如果原始值沒有屬性,那為什么"abc".length能返回值?

因?yàn)閖avascript在原始值與對(duì)象之間很輕松的互換類型。在這種情況下,為了得到length屬性,字符串的value值就被強(qiáng)制轉(zhuǎn)換為字符串對(duì)象。String對(duì)象僅僅是被瞬間轉(zhuǎn)換,然后會(huì)被當(dāng)著垃圾回收處理掉。對(duì)于這種現(xiàn)象,我們先避開這個(gè)難解的謎團(tuán),接下來慢慢分析它。

String.prototype.returnMe= function() {
    return this;
}

var a = "abc";
var b = a.returnMe(); 

a; //"abc"
typeof a; //"string" (still a primitive)
b; //"abc"
typeof b; //"object"

但是你會(huì)發(fā)現(xiàn),只要這個(gè)對(duì)象還存在,這個(gè)對(duì)象不會(huì)被當(dāng)著垃圾回收來處理。

在strict模式下,這種現(xiàn)象不會(huì)出現(xiàn)。

這里有一個(gè)典型的實(shí)例來解釋這個(gè)對(duì)象沒有被當(dāng)著垃圾回收來處理掉。

Number.prototype.toString = function() {
    return typeof this;
}

(123).toString(); //"object"

也就是說原始值是有屬性的(包括方法),這些屬性是他們各自的原型所定義的。

這些對(duì)象能被強(qiáng)制轉(zhuǎn)換為values嗎?

是的,大多數(shù)情況下,對(duì)象僅僅是容器,value是他們包含的原始值,他們會(huì)按需的強(qiáng)制性轉(zhuǎn)換為對(duì)應(yīng)的value值。來看下面的實(shí)例:

//object coerced to primitive
var Twelve = new Number(12);
var fifteen = Twelve + 3;
fifteen; //15
typeof fifteen; //"number" (primitive)
typeof Twelve; //"object"; (still object)

//another object coerced to primitive
new String("hippo") + "potamus"; //"hippopotamus"

//object not coerced (because "typeof" operator can work with objects)
typeof new String("hippo") + "potamus"; //"objectpotamus"

奇怪的是boolean 對(duì)象不會(huì)被輕易的轉(zhuǎn)換,除了遇到null 與undefined, boolean 對(duì)象都會(huì)自動(dòng)修正為true,試試這個(gè):

if (new Boolean(false)) {
    alert("true???");
}

通常你可能想清楚的知道boolean 對(duì)象的value值,下面的做法能明確的斷定value值是true,還是false

var a = "";
new Boolean(a).valueOf(); //false

但是,這樣做可能更容易些:

var a = Boolean("");
a; //false

甚至是這樣:

var a = "";
!!a; //false
強(qiáng)制轉(zhuǎn)換允許我們對(duì)一個(gè)原始值賦值嗎?

答案是no

var primitive = "september";
primitive.vowels = 3;

primitive.vowels; //undefined;

如果javascript探測(cè)到試圖對(duì)一個(gè)原始值賦值,事實(shí)上它會(huì)強(qiáng)制把這個(gè)原始值轉(zhuǎn)換為對(duì)象,但是,正如上面的實(shí)例,這個(gè)新對(duì)象是沒有指針的,會(huì)立刻被回收處理掉。

這里有個(gè)偽代碼實(shí)例來解釋這種現(xiàn)象:

var primitive = "september";
primitive.vowels = 3;
//new object created to set property
(new String("september")).vowels = 3;

primitive.vowels;
//another new object created to retrieve property
(new String("september")).vowels; //undefined

正如你看到的,這種寫法不僅無效,而且是相當(dāng)?shù)睦速M(fèi)。

結(jié)論

最后證明相對(duì)于對(duì)原始值賦值,給對(duì)象賦值是它的一個(gè)唯一優(yōu)勢(shì)。但是在實(shí)踐中,這種做法也是可疑的。Strings, booleans 與numbers有著特定的,定義好的用途。重新定義他們恰恰讓人難以理解。而且,原始值是不可變的,你不可能通過改變他們的屬性值來修改他們。

var me = new String("Angus");
me.length = 2; //(error in strict mode)
me.length; //5 (not 2 - thanks @joseanpg)
me.valueOf(); "Angus"

而且,我認(rèn)為對(duì)原始值深刻的理解,以及當(dāng)使用他們的時(shí)候知道具體發(fā)生了什么是深入理解這門語言邁出重要的一步。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85272.html

相關(guān)文章

  • JavaScript中,{}+{} 等于多少?

    摘要:如果返回值是一個(gè)原始值,則返回這個(gè)原始值。如果或者中的任意一個(gè)為字符串,則將另外一個(gè)也轉(zhuǎn)換成字符串,然后返回兩個(gè)字符串連接操作后的結(jié)果。因此,的結(jié)果實(shí)際上是兩個(gè)空字符串的連接。 原文:What is {} + {} in JavaScript? 譯者:justjavac 最近,Gary Bernhardt 在一個(gè)簡(jiǎn)短的演講視頻Wat中指出了一個(gè)有趣的 JavaScript 怪癖...

    Jrain 評(píng)論0 收藏0
  • 前端資源系列(5)-JavaScript奇味探索

    摘要:中有很多奇妙的東西,歸咎歸功于設(shè)計(jì)時(shí)候的迅速。缺陷有,但是的強(qiáng)大確實(shí)體現(xiàn)的淋漓盡致。它是如此的靈活,當(dāng)然隨之而來的便是開發(fā)的代價(jià),它不像強(qiáng)類型語言那樣規(guī)規(guī)矩矩。難得周末晚上清閑,回味這些看起來有點(diǎn)怪怪卻又在發(fā)生著的問題。 JavaScript中有很多奇妙的東西,歸咎or歸功于設(shè)計(jì)時(shí)候的迅速。缺陷有,但是JavaScript的強(qiáng)大確實(shí)體現(xiàn)的淋漓盡致。 它是如此的靈活,當(dāng)然隨之而來的便是開...

    kyanag 評(píng)論0 收藏0
  • eval()不是魔鬼,只是被誤解了(翻譯

    摘要:因?yàn)榈栏窭沟拇蠖鄶?shù)作品并沒有注明日期,所以,我不確定他是否是在年創(chuàng)造了這個(gè)術(shù)語。但這并不能說明是魔鬼,這只是開發(fā)工作流程中的一點(diǎn)問題。中間人攻擊被認(rèn)為是的永遠(yuǎn)存在的危險(xiǎn),會(huì)受到蠕蟲的的攻擊。 原文來自:https://www.nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood/ 作者:Nicholas C.Z...

    elarity 評(píng)論0 收藏0
  • JavaScript Puzzlers! 解惑(一):為什么 ["1", &qu

    摘要:第一題為的返回值。返回值其中的每個(gè)元素均為關(guān)聯(lián)的原始數(shù)組元素的回調(diào)函數(shù)返回值的新數(shù)組。修改數(shù)組對(duì)象數(shù)組對(duì)象可由回調(diào)函數(shù)修改。方法啟動(dòng)后的條件元素是否傳遞給回調(diào)函數(shù)在數(shù)組的原始長(zhǎng)度之外添加元素。 JavaScript Puzzlers! 被稱為 javascript 界的專業(yè)八級(jí)測(cè)驗(yàn),感興趣的 jser 可以去試試。 我試了一下, 36 道題只做對(duì)了 19 道, 算下來正確率為 53%,...

    k00baa 評(píng)論0 收藏0
  • JavaScript機(jī)器學(xué)習(xí)之線性回歸

    摘要:不能用于機(jī)器學(xué)習(xí)太慢幻覺矩陣操作太難有函數(shù)庫(kù)啊,比如只能用于前端開發(fā)開發(fā)者笑了機(jī)器學(xué)習(xí)庫(kù)都是開發(fā)者機(jī)器學(xué)習(xí)庫(kù)神經(jīng)網(wǎng)絡(luò)神經(jīng)網(wǎng)絡(luò)自然語言處理卷積神經(jīng)網(wǎng)絡(luò)一系列庫(kù)神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)我們將使用來實(shí)現(xiàn)線性回歸,源代碼在倉(cāng)庫(kù)。 譯者按: AI時(shí)代,不會(huì)機(jī)器學(xué)習(xí)的JavaScript開發(fā)者不是好的前端工程師。 原文: Machine Learning with JavaScript : Part 1 ...

    gitmilk 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<