摘要:結(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
摘要:如果返回值是一個(gè)原始值,則返回這個(gè)原始值。如果或者中的任意一個(gè)為字符串,則將另外一個(gè)也轉(zhuǎn)換成字符串,然后返回兩個(gè)字符串連接操作后的結(jié)果。因此,的結(jié)果實(shí)際上是兩個(gè)空字符串的連接。 原文:What is {} + {} in JavaScript? 譯者:justjavac 最近,Gary Bernhardt 在一個(gè)簡(jiǎn)短的演講視頻Wat中指出了一個(gè)有趣的 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)然隨之而來的便是開...
摘要:因?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...
摘要:第一題為的返回值。返回值其中的每個(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%,...
摘要:不能用于機(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 ...
閱讀 1317·2021-11-11 10:57
閱讀 3735·2021-09-07 10:10
閱讀 3452·2021-08-03 14:03
閱讀 3080·2019-08-30 13:45
閱讀 694·2019-08-29 11:19
閱讀 1050·2019-08-28 18:07
閱讀 3110·2019-08-26 13:55
閱讀 818·2019-08-26 12:17