欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript加號"+"的二義性說明

 更新時間:2013年03月04日 11:12:28   作者:  
單個的加號作為運算符在 JavaScript 中有三種作用。

單個的加號作為運算符在 JavaScript 中有三種作用。它可以表示字符串連接,例如:

復制代碼 代碼如下:

var str = 'hello ' + 'world!';

或表示數(shù)字取正值的一元運算符,例如:

復制代碼 代碼如下:

var n = 10; 
var n2 = +n;

或表示數(shù)值表達式的求和運算,例如:

復制代碼 代碼如下:

var n = 100; 
var nn2 = n + 1;
 

三種表示法里,字符串連接與數(shù)字求和是容易出現(xiàn)二義性的。因為 JavaScript 中對這兩種運算的處理將依賴于數(shù)據(jù)類型,而無法從運算符上進行判讀。我們單獨地看一個表達式:

復制代碼 代碼如下:

aa = a + b;

是根本無法知道它真實的含義是在求和,亦或是在做字符串連接。這在 JavaScript 引擎做語法分析時,也是無法確知的。

加號"+"帶來的主要問題與另一條規(guī)則有關(guān)。這條規(guī)則是"如果表達式中存在字符串,則優(yōu)先按字符串連接進行運算"。例如:


復制代碼 代碼如下:

var v1 = '123'; 
var v2 = 456; 

//顯示結(jié)果值為字符串'123456' 
alert( v1 + v2 );


這會在一些宿主中出現(xiàn)問題。例如瀏覽器中,由于 DOM 模型的許多值看起來是數(shù)字,但實際上卻是字符串。因此試圖做"和"運算,卻變成了"字符串連接"運算。下面的例子說明了這個問題:


復制代碼 代碼如下:

<img id="testPic" style="border: 1 solid red">
 

我們看到這個 id 為 testPic 的 IMG 元素(element)有一個寬度為 1 的邊框--省略了默認的單位 px(pixel,像素點)。但是如果你試圖用下面的代碼來加寬它的邊框,就會導致錯誤(一些瀏覽器忽略該值,另一些則彈出異常,還有一些瀏覽器則可能崩潰):

復制代碼 代碼如下:

var el = document.getElementById('testPic'); 
el.style.borderWidth += 10;
 

因為事實上在 DOM 模型里,borderWidth 是有單位的字符串值,因此這里的值會是"1px"。JavaScript 本身并不會出錯,它會完成類似下面的運算,并將值賦給 borderWidth:

復制代碼 代碼如下:

el.style.borderWidth = '1px' + 10; 
//值為 '1px10'

這時,瀏覽器的 DOM 模型無法解釋"1px10"的含義,因此出錯了。當你再次讀borderWidth 值時,它將仍是值 1px。那么,怎么證明上述的運算過程呢?下面的代碼將表明 JavaScript 運算的結(jié)果是 1px10,但賦值到 borderWidth 時,是由于 DOM 忽略掉這個錯誤的值,因此 borderWidth 沒有發(fā)生實際的修改:

復制代碼 代碼如下:

alert( el.style.borderWidth = '1px' + 10 );//值為 '1px10'

這個問題追其根源,一方面在于我們允許了省略單位的樣式表寫法,另一方面也在于腳本引擎不能根據(jù)運算符來確定這里的操作是數(shù)值運算還是字符串連接。

后來 W3C 推動 XHTML 規(guī)范,試圖從第一個方面來避免這個問題,但對開發(fā)界的影響仍舊有限。因此,在瀏覽器的開發(fā)商提供的手冊中,都會盡可能地寫明每一個屬性的數(shù)據(jù)類型,以避免開發(fā)人員寫出上面這樣的代碼。在這種情況下,最正確的寫法是:

復制代碼 代碼如下:

var el = document.getElementById('testPic'); 
// 1.取原有的單位 
var value = parseInt(el.style.borderWidth); 
var unit = el.style.borderWidth.substr(value.toString().length); 
// 2.運算結(jié)果并附加單位 
el.style.borderWidth = value + 10 + unit; 

//如果你確知屬性采用了默認單位 px,并試圖仍然省略單位值, 
//那么你可以用下面這種方法(我并不推薦這樣): 
// el.style.borderWidth = parseInt(el.style.borderWidth) + 10;

相關(guān)文章

  • window.open關(guān)于瀏覽器攔截問題分析及解決方法

    window.open關(guān)于瀏覽器攔截問題分析及解決方法

    window.open是javascript函數(shù),該函數(shù)的作用是打開一個新窗口或這改變原來的窗口,如果你直接在js中調(diào)用window.open()函數(shù)去打開一個新窗口,瀏覽器會攔截你,那么如何避免呢,感興趣的朋友可以了解下本文或許對你學習有所幫助
    2013-02-02
  • javascript實現(xiàn)列表滾動的方法

    javascript實現(xiàn)列表滾動的方法

    這篇文章主要介紹了javascript實現(xiàn)列表滾動的方法,較為詳細的分析了javascript實現(xiàn)列表滾動的頁面布局及javascript滾動效果的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 如何利用JavaScript讀取excel文件并繪制echarts圖形

    如何利用JavaScript讀取excel文件并繪制echarts圖形

    這篇文章主要介紹了如何利用JavaScript讀取excel文件并繪制echarts圖形,文章通過excel財務報表,并且需要根據(jù)這張excel表繪制成各種echarts圖形,需要了解更多詳情的小伙伴可以參考一下文章內(nèi)內(nèi)容
    2022-05-05
  • JS typeof fn === ''function'' && fn()詳解

    JS typeof fn === ''function'' && fn()詳解

    最近在學習js的時候發(fā)現(xiàn)很多人都喜歡在JS 中存在fn && fn() 執(zhí)行語句或者typeof fn === 'function' && fn(),下面這篇文章就為大家分享一下
    2020-08-08
  • JavaScript定時顯示廣告代碼分享

    JavaScript定時顯示廣告代碼分享

    這篇文章主要介紹了JavaScript定時顯示廣告代碼分享,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-03-03
  • JavaScript實現(xiàn)的前端AES加密解密功能【基于CryptoJS】

    JavaScript實現(xiàn)的前端AES加密解密功能【基于CryptoJS】

    這篇文章主要介紹了JavaScript實現(xiàn)的前端AES加密解密功能,涉及javascript基于CryptoJS插件進行AES加密解密操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2018-08-08
  • bcastr2.0 通用的圖片瀏覽器

    bcastr2.0 通用的圖片瀏覽器

    bcastr2.0 通用的圖片瀏覽器...
    2006-11-11
  • 原生js+ajax分頁組件

    原生js+ajax分頁組件

    這篇文章主要為大家詳細介紹了原生js+ajax分頁組件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • webpack中如何使用雪碧圖的示例代碼

    webpack中如何使用雪碧圖的示例代碼

    這篇文章主要介紹了webpack中如何使用雪碧圖的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • 網(wǎng)頁和瀏覽器兼容性問題匯總(draft1)

    網(wǎng)頁和瀏覽器兼容性問題匯總(draft1)

    由于IE擴展了許多私有的DOM、CSS等導致許多網(wǎng)頁的開發(fā)者都根據(jù)IE開發(fā),才導致許多網(wǎng)頁的不規(guī)范,從而導致現(xiàn)在的瀏覽器瀏覽相同網(wǎng)頁效果不盡相同。
    2009-06-06

最新評論