摘要:結論最后證明相對于對原始值賦值,給對象賦值是它的一個唯一優勢。而且,原始值是不可變的,你不可能通過改變他們的屬性值來修改他們。而且,我認為對原始值深刻的理解,以及當使用他們的時候知道具體發生了什么是深入理解這門語言邁出重要的一步。
第一次翻譯,可能有很多地方不恰當,歡迎指正。
原文地址:http://javascriptweblog.wordpress.com/2010/09/27/the-secret-life-of-javascript-primitives/
你可能不知道,在javascript中,在使用string, number, 布爾類型這些原始值時,都會遇到意想不到的問題。閱讀下文,來揭曉里面的秘密。
基礎介紹對象就是各個屬性的集合,屬性可以是對一個對象的引用或是一個原始值,原始值是一個值,他們沒有屬性。
在 JS 里的五類原始類型是:undefined, null, boolean, string 和 number."其余"的類型都是對象.其中 boolean, string 和 number 原始類型可以被對應的對象類型包裹.這些對象都應該是 Boolean, String 和 Number 類的實例。
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能返回值?
因為javascript在原始值與對象之間很輕松的互換類型。在這種情況下,為了得到length屬性,字符串的value值就被強制轉換為字符串對象。String對象僅僅是被瞬間轉換,然后會被當著垃圾回收處理掉。對于這種現象,我們先避開這個難解的謎團,接下來慢慢分析它。
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"
但是你會發現,只要這個對象還存在,這個對象不會被當著垃圾回收來處理。
在strict模式下,這種現象不會出現。
這里有一個典型的實例來解釋這個對象沒有被當著垃圾回收來處理掉。
Number.prototype.toString = function() { return typeof this; } (123).toString(); //"object"
也就是說原始值是有屬性的(包括方法),這些屬性是他們各自的原型所定義的。
這些對象能被強制轉換為values嗎?是的,大多數情況下,對象僅僅是容器,value是他們包含的原始值,他們會按需的強制性轉換為對應的value值。來看下面的實例:
//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 對象不會被輕易的轉換,除了遇到null 與undefined, boolean 對象都會自動修正為true,試試這個:
if (new Boolean(false)) { alert("true???"); }
通常你可能想清楚的知道boolean 對象的value值,下面的做法能明確的斷定value值是true,還是false
var a = ""; new Boolean(a).valueOf(); //false
但是,這樣做可能更容易些:
var a = Boolean(""); a; //false
甚至是這樣:
var a = ""; !!a; //false強制轉換允許我們對一個原始值賦值嗎?
答案是no
var primitive = "september"; primitive.vowels = 3; primitive.vowels; //undefined;
如果javascript探測到試圖對一個原始值賦值,事實上它會強制把這個原始值轉換為對象,但是,正如上面的實例,這個新對象是沒有指針的,會立刻被回收處理掉。
這里有個偽代碼實例來解釋這種現象:
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
正如你看到的,這種寫法不僅無效,而且是相當的浪費。
結論最后證明相對于對原始值賦值,給對象賦值是它的一個唯一優勢。但是在實踐中,這種做法也是可疑的。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"
而且,我認為對原始值深刻的理解,以及當使用他們的時候知道具體發生了什么是深入理解這門語言邁出重要的一步。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85272.html
摘要:如果返回值是一個原始值,則返回這個原始值。如果或者中的任意一個為字符串,則將另外一個也轉換成字符串,然后返回兩個字符串連接操作后的結果。因此,的結果實際上是兩個空字符串的連接。 原文:What is {} + {} in JavaScript? 譯者:justjavac 最近,Gary Bernhardt 在一個簡短的演講視頻Wat中指出了一個有趣的 JavaScript 怪癖...
摘要:中有很多奇妙的東西,歸咎歸功于設計時候的迅速。缺陷有,但是的強大確實體現的淋漓盡致。它是如此的靈活,當然隨之而來的便是開發的代價,它不像強類型語言那樣規規矩矩。難得周末晚上清閑,回味這些看起來有點怪怪卻又在發生著的問題。 JavaScript中有很多奇妙的東西,歸咎or歸功于設計時候的迅速。缺陷有,但是JavaScript的強大確實體現的淋漓盡致。 它是如此的靈活,當然隨之而來的便是開...
摘要:因為道格拉斯的大多數作品并沒有注明日期,所以,我不確定他是否是在年創造了這個術語。但這并不能說明是魔鬼,這只是開發工作流程中的一點問題。中間人攻擊被認為是的永遠存在的危險,會受到蠕蟲的的攻擊。 原文來自:https://www.nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood/ 作者:Nicholas C.Z...
摘要:第一題為的返回值。返回值其中的每個元素均為關聯的原始數組元素的回調函數返回值的新數組。修改數組對象數組對象可由回調函數修改。方法啟動后的條件元素是否傳遞給回調函數在數組的原始長度之外添加元素。 JavaScript Puzzlers! 被稱為 javascript 界的專業八級測驗,感興趣的 jser 可以去試試。 我試了一下, 36 道題只做對了 19 道, 算下來正確率為 53%,...
摘要:不能用于機器學習太慢幻覺矩陣操作太難有函數庫啊,比如只能用于前端開發開發者笑了機器學習庫都是開發者機器學習庫神經網絡神經網絡自然語言處理卷積神經網絡一系列庫神經網絡深度學習我們將使用來實現線性回歸,源代碼在倉庫。 譯者按: AI時代,不會機器學習的JavaScript開發者不是好的前端工程師。 原文: Machine Learning with JavaScript : Part 1 ...
閱讀 1303·2021-11-11 10:57
閱讀 3718·2021-09-07 10:10
閱讀 3442·2021-08-03 14:03
閱讀 3067·2019-08-30 13:45
閱讀 681·2019-08-29 11:19
閱讀 1040·2019-08-28 18:07
閱讀 3100·2019-08-26 13:55
閱讀 809·2019-08-26 12:17