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

來源:互聯網
上載者:User

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

複製代碼 代碼如下:var str = 'hello ' + 'world!';

或表示數字取正值的一元運算子,例如:

複製代碼 代碼如下:var n = 10;
var n2 = +n;

或表示數值運算式的求和運算,例如:

複製代碼 代碼如下:var n = 100;
var nn2 = n + 1;

三種標記法裡,字串串連與數字求和是容易出現二義性的。因為 JavaScript 中對這兩種運算的處理將依賴於資料類型,而無法從運算子上進行判讀。我們單獨地看一個運算式:

複製代碼 代碼如下:aa = a + b;

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

加號"+"帶來的主要問題與另一條規則有關。這條規則是"如果運算式中存在字串,則優先按字串串連進行運算"。例如:

複製代碼 代碼如下:var v1 = '123';
var v2 = 456;

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

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

複製代碼 代碼如下:<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 運算的結果是 1px10,但賦值到 borderWidth 時,是由於 DOM 忽略掉這個錯誤的值,因此 borderWidth 沒有發生實際的修改:

複製代碼 代碼如下:alert( el.style.borderWidth = '1px' + 10 );//值為 '1px10'

這個問題追其根源,一方面在於我們允許了省略單位的樣式表寫法,另一方面也在於指令碼引擎不能根據運算子來確定這裡的操作是數值運算還是字串串連。

後來 W3C 推動 XHTML 規範,試圖從第一個方面來避免這個問題,但對開發界的影響仍舊有限。因此,在瀏覽器的開發商提供的手冊中,都會儘可能地寫明每一個屬性的資料類型,以避免開發人員寫出上面這樣的代碼。在這種情況下,最正確的寫法是:

複製代碼 代碼如下:var el = document.getElementById('testPic');
// 1.取原有的單位
var value = parseInt(el.style.borderWidth);
var unit = el.style.borderWidth.substr(value.toString().length);
// 2.運算結果並附加單位
el.style.borderWidth = value + 10 + unit;

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.