Javascript 数据类型、数值类型、数据类型转换、一元操作符、二元操作符

1.JS中数据类型

基础数据类型:string、number、boolean、undefined、null
复杂数据类型:object

2.三个开发上的建议

  1. 当你需要新建一个变量并且需要赋值,或者新建一个对象需要为对象的属性赋值时,可以用null
  2. 但判断一个函数的某一个参数是否传入的时候通常使用 === 'undefined'进行判断
  3. 检测某一个值是否存在或者是否为null用 === null 进行判断

3.只有6个值在进行bool类型转换的时候可以转换为false

这6个值为:undefined、null、 +0、-0、’’、NaN 空数据和{}为true

Boolean(undefined)		// false
Boolean(null)			// false
Boolean(+0)				// false
Boolean(-0)				// false
Boolean('')				// false
Boolean(NaN)			// false
Boolean({})				// true

4.数值类型:常规的数字,无穷,NaN

  1. 小数:0.1 + 0.2 != 0.3 原因为js表示数字时是用二进制表示数字的,可以这样计算:
    0.1x10 + 0.2x10 = 3
    3/10 =0.3
    
  2. NaN: not a number 是一个不等于任何数字的数字类型,typeof(NaN)= “number”NaN !== NaN,它是唯一一个不等于它本身的数字
  3. 字符串:本质是一个unicode编码的序列,length属性返回的是unicode编码的长度,一个汉字返回的长度是1
  4. 理论上只有对象(Object)可以使用属性和方法的引用,字符串引用方法时,会先判断表达式是不是对象,若不是对象,就会直接报错,在所有的基本类型中,只有nullundefined不能转换为对象(Object)
  5. 复杂数据类型:object,是由属性和属性的值所组成的无序列表的合集

5.对象和原始类型的区别

  1. 对象有属性
  2. 对象有方法:方法本身是一种特殊的方法
  3. 对象是可以改变的

6.对象的分类

  1. 常用对象:String,Boolean,正则表达式,Object,Number,Function,Array,Date
  2. 内置对象:Global,Math,Json 与其他对象的区别就是,如果使用内置对象的时候是不需要用new操作符的,可以直接使用
  3. 数组对象:Windows,和JS本身运行环境有关系的
  4. 自定义对象:

7.基础数据类型和对象的转化

  1. 原始类型<->原始类型(相互转换)
    (1)原始类型<->字符串,直接加俩""
     Boolean -> string :"true" or "false",
     Number -> String:
     10.toString() = 10(默认以十进制为基)
     基模式:10.toString(2) = 1010, 10.toString(8) = 12, 10.toString(16) = A
    
    (2) 原始类型<->数字
    Number(undefined)		// NaN
    Number(null)			// 0
    Number(true)				// 1
    Number(false)				// 0
    Number('123')				// 123
    Number('1abc)			// NaN
    Number('')				// 0
    
    ECMAScript 提供了两种把非数字的原始值转换成数字的方法,即 parseInt()parseFloat()
    正如您可能想到的,前者把值转换成整数,后者把值转换成浮点数。只有对 String 类型调用这些方法,它们才能正确运行;对其他类型返回的都是 NaN。
    parseInt(12345red) = 12345, parseInt(“AF”, 16) = 175 // (基模式)
    parseFloat()只能是十进制,不能有基模式,
    第一个出现的小数点是有效字符。如果有两个小数点,第二个小数点将被看作无效的。parseFloat() 会把这个小数点之前的字符转换成数字。这意味着字符串 "11.22.33" 将被解析成 11.22
    使用 parseFloat() 方法的另一不同之处在于,字符串必须以十进制形式表示浮点数,而不是用八进制或十六进制。该方法会忽略前导 0,所以八进制数 0102 将被解析为 102。对于十六进制数 0xA,该方法将返回 NaN,因为在浮点数中,x 不是有效字符。(注释:经测试,具体的浏览器实现会返回 0,而不是 NaN。)
    (3) 原始类型<->bool
    只有6个值在进行bool类型转换的时候可以转换为false
    这6个值为:undefined、null、 +0、-0、’’、NaN 空数据和{}为true
    Boolean(undefined)		// false
    Boolean(null)			// false
    Boolean(+0)				// false
    Boolean(-0)				// false
    Boolean('')				// false
    Boolean(NaN)			// false
    Boolean({})				// true
    
    (4)强制类型转换
    您还可以使用强制类型转换(type casting)来处理转换值的类型。使用强制类型转换可以访问特定的值,即使它是另一种类型的。
    编者注:cast 有“铸造”之意,很贴合“强制转换”的意思。
    ECMAScript 中可用的 3 种强制类型转换如下:
    • Boolean(value) - 把给定的值转换成 Boolean 型;
    • Number(value) - 把给定的值转换成数字(可以是整数或浮点数);
    • String(value) - 把给定的值转换成字符串;强制转换成字符串和调用 toString() 方法的唯一不同之处在于,对 nullundefined 值强制类型转换可以生成字符串而不引发错误:
    var s1 = String(null);     //"null"
    var oNull = null;
    var s2 = oNull.toString();      //会引发错误
    
    用这三个函数之一转换值,将创建一个新值,存放由原始值直接转换成的值。这会造成意想不到的后果。
    Number() 函数的强制类型转换与 parseInt()parseFloat() 方法的处理方式相似,只是它转换的是整个值,而不是部分值。
    parseInt()parseFloat() 方法只转换第一个无效字符之前的字符串,因此 "1.2.3" 将分别被转换为 11.2
    Number() 进行强制类型转换,"1.2.3" 将返回 NaN,因为整个字符串值不能转换成数字。如果字符串值能被完整地转换,Number() 将判断是调用 parseInt() 方法还是 parseFloat() 方法。
  2. 原始类型<->对象
    PS:只有null和undefined不能转换为对象(Object)
    数字和bool->对象:l转换为object时为一个对象,对象的名字叫原始值
    Object (true) = [Boolean: true]
    Object (3) = [Number: 3]
    

字符串->对象 Object ('abc') = [String: 'abc']
对象->boolean 均为true
对象->字符串toStringvalueOf,若valueOf后返回结果是原始类型则result->字符串的转换,
对象->数字,先valueOftoString,若valueOf后返回结果是原始类型,则直接返回回来,若还是object,则再调用toString,若返回结果result是原始类型,则result->数字的转换,若不是,则报错(Number([])=0,Number({})=NaN)
PS:toString()是可以接收参数的,表示的是几进制的数,范围为2-36,Math.random().toString(36)生成序列书

8.变量定义

使用var: 局部变量(作用于是当前的函数),创建的变量不可删除,变量会被提前
不使用var: 全局变量,创建的变量可以删除(windows上面的一个属性),变量不会被提前

9.一元操作符:很高的优先级,仅在. , () []之后

(1)、+、-、前++、后++、前–、后–、!、typeof、void、delete,typeof后面的括号()最好写上,!转换成布尔值;

Boolean(3) == !!(3)			// true
String(3) == 3 + ''			// true
+'123' == Number(123)		// true

delete 运算符删除对以前定义的对象属性或方法的引用。例如:

var o = new Object;
o.name = "David";
alert(o.name);  //输出 "David"
delete o.name;
alert(o.name);  //输出 "undefined"

在这个例子中,删除了 name 属性,意味着强制解除对它的引用,将其设置为 undefined(即创建的未初始化的变量的值)。
delete 运算符不能删除开发者未定义的属性和方法。例如,下面的代码将引发错误:

delete o.toString;

即使 toString 是有效的方法名,这行代码也会引发错误,因为 toString() 方法是原始的 ECMAScript 方法,不是开发者定义的。
一元加法和一元减法
尽管一元加法对数字无作用,但对字符串却有有趣的效果,会把字符串转换成数字。

var sNum = "20";
alert(typeof sNum);     //输出 "string"
var iNum = +sNum;
alert(typeof iNum);     //输出 "number"

(2)、位运算 NOT
位运算 NOT 由否定号(~)表示,它是 ECMAScript 中为数不多的与二进制算术有关的运算符之一。位运算 NOT 实质上是对数字求负,然后减 1,
(3)、逻辑 NOT(!)逻辑 NOT 运算符返回的一定是 Boolean 值。
逻辑 NOT 运算符的行为如下:

  • 如果运算数是对象,返回 false
  • 如果运算数是数字 0,返回 true
  • 如果运算数是 0 以外的任何数字,返回 false
  • 如果运算数是 null,返回 true
  • 如果运算数是 NaN,返回 true
  • 如果运算数是 undefined,返回 true
!{}				// false
!0				// true
!3				// false
!null				// true
!NaN			// true
!undefined		// true

10.二元操作符

&& 、||、+、-、x、/

1.加法运算符

与乘性运算符一样,在处理特殊值时,ECMAScript 中的加法也有一些特殊行为:

1 + NaN = NaN
-Infinity +  -Infinity = Infinity
Infinity +  -Infinity = NaN
+0 + +0 = +0
-0 + +0 = +0
-0 + -0 = -0
undefined + true = NaN
null + false = 0
1 + false = 1
1 + true = 2
{name: '张三'} + {age: 24} = [object Object][object Object]

不过,如果某个运算数是字符串,那么采用下列规则:

  • 如果两个运算数都是字符串,把第二个字符串连接到第一个上。'hello' + 'word' // helloword
  • 如果只有一个运算数是字符串,把另一个运算数转换成字符串,结果是两个字符串连接成的字符串。'hello' + 123 // hello123
  • 注意:为了避免 JavaScript 中的一种常见错误,在使用加法运算符时,一定要仔细检查运算数的数据类型。
2.减法运算符

在处理特殊值时,减法运算符也有一些特殊行为:

console.log(1 - NaN)							// NaN
console.log( Infinity -  Infinity)			// NaN
console.log( -Infinity -  -Infinity)			// NaN
console.log( Infinity -  -Infinity)				// Infinity
console.log( -Infinity -  Infinity)				// -Infinity
console.log(+0 - +0)							// +0
console.log(-0 - -0)							// -0
console.log(+0 - -0)							// +0
console.log('hello' - 12)							// NaN(某个运算符不是数字,也不能强制转化为数字)
3.逻辑 AND 运算符( && ),

逻辑 AND 运算的运算数可以是任何类型的,不止是 Boolean 值。
如果某个运算数不是原始的 Boolean 型值,逻辑 AND 运算并不一定返回 Boolean 值:

  • 如果一个运算数是对象,另一个是 Boolean 值,返回该对象。
  • 如果两个运算数都是对象,返回第二个对象。
  • 如果某个运算数是 null,返回 null。
  • 如果某个运算数是 NaN,返回 NaN。
  • 如果某个运算数是 undefined,返回undefined 。
4.逻辑 OR 运算符( || )

与逻辑 AND 运算符相似,如果某个运算数不是 Boolean 值,逻辑 OR 运算并不一定返回 Boolean 值:

  • 如果一个运算数是对象,并且该对象左边的运算数值均为 false,则返回该对象。
  • 如果两个运算数都是对象,返回第一个对象。
  • 如果最后一个运算数是 null,并且其他运算数值均为 false,则返回 null。
  • 如果最后一个运算数是 NaN,并且其他运算数值均为 false,则返回 NaN。
  • 如果某个运算数是 undefined,则根据另一个运算数返回。
undefined || null								// null
null || undefined								// undefined
undefined || 0								// 0
0 || undefined								// undefined
undefined || 123								// 123
undefined || 'hello'								// 'hello'
5.关系运算符< >

返回的结果是boolean类型,更偏向于数字的操作,任何包含 NaN 的关系运算符都要返回 false

6.等性运算符

ECMAScript 提供了两套等性运算符:等号和非等号用于处理原始值,全等号和非全等号用于处理对象。
=== 全等:数据类型和值完全一致
== 相等:undefined == null,数字,字符串,boolean类型进行比较时,先转换为数字再进行比较,等号和非等号( == , != )

  1. 在 ECMAScript 中,等号由双等号(==)表示,当且仅当两个运算数相等时,它返回
    true。非等号由感叹号加等号(!=)表示,当且仅当两个运算数不相等时,它返回
    true。为确定两个运算数是否相等,这两个运算符都会进行类型转换。 执行类型转换的规则如下:
    • 如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。
    • 如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
    • 如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
    • 如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。
      在比较时,该运算符还遵守下列规则: 值 null 和 undefined 相等。 在检查相等性时,不能把 null 和 undefined 转换成其他值。 如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。
      如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。
      重要提示: 即使两个数都是 NaN,等号仍然返回 false,因为根据规则,NaN 不等于 NaN。 全等号和非全等号
  2. 全等号由三个等号表示(===),只有在无需类型转换运算数就相等的情况下,才返回 true。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章