是否有任何理由我應該使用string.charAt(x)
而不是括號記號string[x]
?string.charAt(x)或string [x]?
回答
// Bracket Notation
"Test String1"[6]
// Real Implementation
"Test String1".charAt(6)
這是一個壞主意,用括號內,這些原因(Source):
這種表示法並不在IE7工作。 第一個代碼片段將返回在IE7中未定義的 。如果你碰巧使用 字符串所有 在你的代碼中的括號標記,並要遷移 到
.charAt(pos)
,這是一個真正的痛苦: 支架都是用在你的代碼 ,有沒有簡單的方法,如果 這是檢測對於一個字符串或一個 數組/對象。您不能使用此表示法設置字符。由於 沒有任何警告,這是令人困惑和 令人沮喪。如果您正在使用
.charAt(pos)
函數,您不會嘗試去做 。
基本上,這是一種在所有瀏覽器中都沒有完全實現的捷徑。
請注意,您無法使用任一種方法編寫字符。但是,該功能在使用.charAt()
函數時更易於理解,在大多數語言中該函數是隻讀函數。
從MDN:
有一個字符串中訪問一個個性的兩種方式。第一個是
charAt
方法:return 'cat'.charAt(1); // returns "a"
另一種方法是治療所述字符串作爲數組,其中每個索引對應於一個單獨的字符:
return 'cat'[1]; // returns "a"
的第二種方法(處理字符串作爲數組)不是ECMAScript 3的一部分;這是一個JavaScript和ECMAScript 5功能(並且在所有瀏覽器中都不支持)。
在這兩種情況下,嘗試設置單個字符都不起作用。試圖通過charA設置一個字符會導致錯誤,當試圖通過索引來設置字符時不會拋出錯誤,但字符串本身並未改變。
因此,正如您現在可能已經發現的那樣,從兼容性角度來看,charAt()
更好。
確實,ECMA 5不是但支持所有瀏覽器,但它在MOST瀏覽器上受支持:意味着IE9及更高版本和所有Chrome/Firefox版本: http://kangax.github.io/compat-table/es5/#Property_access_on_strings 沒有JS功能將永遠得到100%的支持,我覺得避免使用ECMA 5功能將使我們永遠在過去...... – 2015-02-11 13:20:53
String.charAt()是標準的,它適用於所有瀏覽器。 在非IE瀏覽器中,您可以使用括號表示來訪問字符,但IE不支持。 (不知道他們是否已經實施了最新版本)。
如果有人真的想使用支架通知。將字符串轉換爲char數組是明智的選擇,以便與任何瀏覽器兼容。
var testString = "Hello";
var charArr = myString.split('');
非常有趣的結果,當你測試的字符串索引訪問VS的charAt()
方法。似乎Chrome是唯一一款喜歡charAt
以上的瀏覽器。
他們可以給在邊緣情況不同的結果。
'hello'[NaN] // undefined
'hello'.charAt(NaN) // 'h'
'hello'[true] //undefined
'hello'.charAt(true) // 'e'
的功能的charAt取決於索引如何轉換爲一個數字在spec。
''hello'[undefined] // undefined'和''hello'.charAt(undefined)// h' – 2016-02-25 20:58:29
'null'就像'undefined'一樣工作,但是看到這個:''hello「[」00「] //「undefined」,但是「hello」.charAt(「00」)//「h」'和「」hello「[」0「] //」h「' – panzi 2016-02-27 19:42:43
這一直說服我繼續使用'[' 。 – ApproachingDarknessFish 2017-06-06 15:44:30
- 1. XName x =「string」?
- 2. Flot With「String」x-axis
- 3. Python 3.X或Python 2.X
- 4. Datamapper 0.9.x或0.10.x?
- 5. CSng()或x 1F?
- 6. R:f(x)!= sapply(x,f) - 缺陷或特徵?
- 7. Cassandra從2.0.x升級到2.1.x或3.0.x
- 8. -E或-x當輸入來自標準輸入時需要-x或-x
- 9. Prolog X = f(X)。 (X)
- 10. Casper.js WaitFor X或Y
- 11. Hibernate 2.1.6或3.x?
- 12. split()loop:if string number = x,insert <br>
- 13. 從#定義SQR(X)(X * X)
- 14. 什麼是泛型語法的名稱:「X. <String,String> method()」
- 15. Parallel.ForEach x of x
- 16. Ruby:%{x}與#{x}?
- 17. 中x = GCC(X ++)
- 18. 在X中X
- 19. 將Realm 2.x對象列表遷移到Realm 3.x String(或其他主類型)列表
- 20. 爲什麼變量初始化到賦值表達式[String x =(x = y)]編譯?
- 21. php curl -k或--insecure,-X
- 22. iOS onTouchMove x或y軸
- 23. 如何從String.charAt解析Int()
- 24. Java:Calc x in sin(x)
- 25. X鍵的X鍵
- 26. 批量更新與IN(x,x,x)
- 27. x * x vs Math.pow(x,2)java performance
- 28. PHP循環內循環x x後x
- 29. X =東西(X)的東西(X)
- 30. 將x => array.Contains(x)表達式轉換爲x => x == 1 || X == 2
的確,這個記法在IE7中不起作用,但是這不是現在的巨大缺點。與此同時,我所做的基準測試顯示,在字符串裝入對象時,在Chrome中使用charAt與indexer時性能下降了三倍。我知道這不是真的相關,但仍值得注意.https://jsfiddle.net/mdasxxd2/ – 2016-07-25 10:51:54
更準確的測試(benchmark.js)https://esbench.com/bench/579609a0db965b9a00965b9e – NoNameProvided 2016-07-25 12:46:08