1.javestript 中所有的數(shù)字都是浮點型
js在浮點數(shù)運算時會出現(xiàn)多位小數(shù)的不準確結(jié)果,浮點數(shù)運算的誤差。在javestript 中所有的數(shù)字都是浮點型,許多編程語言支持多種數(shù)字類型,如浮點型、雙精度型、整數(shù)型和雙精度型,但JS卻不是這樣。在JS中,按照IEEE 754-2008標準的定義,所有數(shù)字都以雙精度64位浮點格式表示。
js無法正常表示大于16位的整數(shù)【非科學計數(shù)】。當你的 所要表達的數(shù) 大于16位整數(shù)時,建議寫成 字符串的形式。
//精度不同的問題
var num1 = .3-.2
var num2 = .2-.1
num1 == num2
num1 == .1
num2 == .1
0.09999999999999998
0.1
false
false
true
// 本身就是浮點數(shù),0當除數(shù)不會報錯
5/2 == 5.0/2 // true
5/0 == Infinity
0/0 == NaN
2.字符串是固定不變的
var str = "string"
str.len = 4
var t = str.len
t
字符串是固定不變的,字符串是基本類型,是直接保存在棧內(nèi)存的變量空間中的,字符串除了是基本類型他還是包裝類型(每當讀取數(shù)據(jù)的時候,后臺就會創(chuàng)建一個對應(yīng)的基本包裝類型的對象 new String(s),從而讓我們能夠調(diào)用一些方法來操作這些數(shù)據(jù)),所以他可以進行slice等操作,但它本質(zhì)上就是一個字符串,不是對象
在js中字符串是固定不變的,類似replace()和toUpperCase()的方法都返回新字符串,但原字符串本身并沒有發(fā)生改變。
t // undefined
str ="String"
"String"
str.toUpperCase()
"STRING"
str
"String"
3.javascript的‘==’ 和‘===’
1=="1"
true
1==="1"
false
雙等號==:
?。?)如果兩個值類型相同,再進行三個等號(===)的比較
(2)如果兩個值類型不同,也有可能相等,需根據(jù)以下規(guī)則進行類型轉(zhuǎn)換在比較:
1)如果一個是null,一個是undefined,那么相等
2)如果一個是字符串,一個是數(shù)值,把字符串轉(zhuǎn)換成數(shù)值之后再進行比較
三等號===:
?。?)如果類型不同,就一定不相等
(2)如果兩個都是數(shù)值,并且是同一個值,那么相等;如果其中至少一個是NaN,那么不相等。(判斷一個值是否是NaN,只能使用isNaN( ) 來判斷)
(3)如果兩個都是字符串,每個位置的字符都一樣,那么相等,否則不相等。
?。?)如果兩個值都是true,或是false,那么相等
?。?)如果兩個值都引用同一個對象或是函數(shù),那么相等,否則不相等
?。?)如果兩個值都是null,或是undefined,那么相等
null == undefined
true
null === undefined
false
typeof undefined
"undefined"
//null也是對象
typeof null
"object"
var obj1 = null
var obj2 = null
obj1 == obj2
true
var obj3 = {}
var obj4 = {}
obj3 == obj4
false
對象的比較并非值的比較,是引用的比較,但是javascript權(quán)威指南中是這樣寫的
If both values are null or both values are undefined, they are equal.
null也是對象確相等,這個不清楚。
4.delete關(guān)鍵字的使用
delete關(guān)鍵字的使用注意:
1.返回值類型為布爾值(true / false),刪除成功返回true
b = {}
delete b
true
2.刪除對象中不存在的屬性,返回值是true
b = {}
delete b.name
true
3.刪除對象的原型對象中的屬性(不能刪除),返回值是true
function Obj() {
this.age = 18;
}
Obj.prototype.name = "張三";
var p1 = new Obj();
console.log(p1.name); //張三
p1.name = "李四";
console.log(p1.name); //李四
//不能直接刪除原型屬性
delete p1.name;
console.log(p1.name); //張三
//刪除原型屬性
delete Person.prototype.name;
console.log(p1.name);//undefined
console.log(p1.age); //18
p1.age = 22;
//可以直接刪除實例屬性
delete p1.age; //可以刪除
console.log(p1.age); //undefined
//刪除不存在的屬性,返回true
4.無法刪除使用var聲明的全局的變量。
var obj = {}
undefined
delete obj
false
obj
{}
5."+"的優(yōu)先轉(zhuǎn)換規(guī)則是字符串連接優(yōu)先
"1"+"2" == "12"
"1"+2 =="12” //轉(zhuǎn)成字符串再相加
1+2 = 3
1+{} = "1[object Object]" //對象先轉(zhuǎn)字符串再相加
(2 + null) == 2 // null轉(zhuǎn)換后變成0
(2 + undefined) == NaN //undefined 轉(zhuǎn)成NaN
6.比較大小
比較運算中的操作數(shù)可以是任意類型的值,但是在執(zhí)行運算時,會被轉(zhuǎn)換為數(shù)字或字符串,然后再進行比較。如果是數(shù)字,則比較大??;如果是字符串,則根據(jù)字符編碼表中的編號值從左到右逐個比較每個字符。
"11"<"3" // true
11<"3" // false
11<3 // false
1.如果一個操作數(shù)為 NaN,或者被轉(zhuǎn)換為 NaN,則始終返回 false。
undefined>"a"
false
2.如果操作數(shù)都無法轉(zhuǎn)換為數(shù)字或字符串,則比較結(jié)果為 false。
{} > {a:1}
false
7.js類型轉(zhuǎn)換表
