JavaScript数据类型与操作符

数据类型

7种数据类型

  • Undefined
  • Null
  • String
  • Boolean
  • Number
  • Symbol:ES6新增
  • Object:复杂数据类型

typeof操作符

该操作符可以确定任意变量的数据类型

function test(){};
console.log(typeof(test));//function

typeof是操作符,而不是函数,共有七种返回字符串

  • "undefined"表示值未定义;

  • "boolean"表示值为布尔值;

  • "string"表示值为字符串;

  • "number"表示值为数值;

  • "object"表示值为对象(而不是函数)或 null

  • "function"表示值为函数;

这里认为null是对空对象的一个引用

Undefined类型

console.log(typeof name)//undefined

假如这行代码是整个代码中的一行,知道其输出undefined.那么name有两种可能

  • name被let或者var声明了(值默认为undefined)
  • name没有被声明

Null类型

Null类型只有一个值null,表示一个空对象指针,假如某个变量未来要赋值某个对象,那么应该用null赋初值,这样就可以使用typeof判断其是否被赋值过,这种做法主要是语义化,表示该变量未来也是对象的引用,当然也可以变成其他类型

let dog = null;
console.log(typeof dog)//object
if(dog != null){
    //dog被赋值
}

null和undefined表面相等

console.log(null == undefined);//true
console.log(null === undefined);//false

console.log(!null);//true
console.log(!undefined);//true

Boolean类型

有两个字面值:true和false

Boolean()转型函数可以将任意类型的值转换为Boolean型

数据类型转换为true的值转换为false的值
Booleantruefalse
String非空字符串‘’(空字符串)
Number非零数值(包含无穷值)0、NaN
Object任意对象null
UndefinedN/A(不存在,应为Undefined只有一个值)undefined

这里转换要清楚,if流控制语句,会自动将其他类型值转换为boolean类型

let dog = {
    name:'Amy',
    age:12,
}
if(dog){
    console.log(dog.name)//Amy
}

Number类型(重要)

Numer类型采用IEEE 754标准表示整数、浮点数(java、c中的双精度值),IEEE 754常用单精度和双精度两种规范,而js只采用双精度规范

双精度64位,1位符号位,11位指数为,52位尾数位

表示不同进制

八进制: 0 或 0o 或 0O
十六进制: 0x 或 0X
二进制: 0b 或者 0B
浮点值
let floatNum = 0.1;//有效推荐
let floatNum = .1;//有效不推荐

存储浮点值使用的内存空间是存储整数的两倍,所以像1.0这种小数点后面是0的数,会自动变成整数存储

科学计数法

let bigNum = 3.1E9;//有效

经典问题0.1+0.2为什么不等于0.3

由于js采用IEEE754双精度规范所以

0.1 => 0.0001 1001 1001 1001…(无限循环)

0.2 => 0.0011 0011 0011 0011…(无限循环)

双精度小数最多支持52位,0.1用52位表示,0.2也用52位表示,相加精度缺失,进位

0.1 + 0.2
    = 0.0001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 (1001...舍弃)
    + 0.0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 (0011...舍弃)
    = 0.0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 (1100...舍弃)
    = 0.0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1101 (入1)
    = 0.30000000000000004

像0.25+0.125就不会存在精度丢失,二进制的无穷小数需要考虑精度丢失问题

值的范围

最小值 Number.MIN_VALUE (5e-324)

最大值 Number.MAX_VALUE(1.797 693 134 862 315 7e+308)

let result = Number.MAX_VALUE + Number.MAX_VALUE; 
console.log(isFinite(result)); // false

isFinite确定数是不是无穷

NaN

不是数值(not a number)

console.log(0/0); // NaN 
console.log(-0/+0); // NaN
console.log(5/0); // Infinity 
console.log(5/-0); // -Infinity

NaN有以下几个属性

  • 任何涉及NaN的数值计算,都会返回NaN

    console.log(NaN*0 + 1);//NaN
    
  • NaN不等于包括NaN在内的任何值

    console.log(NaN == NaN)//false
    

isNaN()接收参数,判断是否“不是数值”

console.log(isNaN(NaN)); // true 
console.log(isNaN(10)); // false,10 是数值
console.log(isNaN("10")); // false,可以转换为数值 10 
console.log(isNaN("blue")); // true,不可以转换为数值
console.log(isNaN(true)); // false,可以转换为数值 1
数值转换

Number()、parseInt()、parseFloat()

Number用于任何数据类型

let num1 = Number("Hello world!"); // NaN 
let num2 = Number(""); // 0 
let num3 = Number("000011"); // 11 
let num4 = Number(true); // 1

parseInt()用于字符串类型:从第一个字符逐个往后转换,当遇到字符不是数值字符、+0、-0就会返回,也就是说遇到小数点,或者空字符,都要返回。

let num1 = parseInt("1234blue"); // 1234 
let num2 = parseInt(""); // NaN 
let num3 = parseInt("0xA"); // 10,解释为十六进制整数
let num4 = parseInt(22.5); // 22 
let num5 = parseInt("70"); // 70,解释为十进制值
let num6 = parseInt("0xf"); // 15,解释为十六进制整数

parseFloat()用于字符串类型:类似于parseInt(),但是遇到小数点第一次有效,后面就无效了

let num1 = parseFloat("1234blue"); // 1234,按整数解析
let num2 = parseFloat("0xA"); // 0 
let num3 = parseFloat("22.5"); // 22.5 
let num4 = parseFloat("22.34.5"); // 22.34 
let num5 = parseFloat("0908.5"); // 908.5 
let num6 = parseFloat("3.125e7"); // 31250000
String类型

通过.length获取字符串长度

toString(),数组、对象、布尔、字符串都有此方法,而null,undefined没有

toString()可以传入一个参数,底数,表示以什么进制转换字符串

console.log(num.toString()); // "10" 
console.log(num.toString(2)); // "1010" 
console.log(num.toString(8)); // "12" 
console.log(num.toString(10)); // "10" 
console.log(num.toString(16)); // "a"

另外String()本质是调用参数的toString()方法

let value1 = 10; 
let value2 = true; 
let value3 = null; 
let value4; 
console.log(String(value1)); // "10" 
console.log(String(value2)); // "true" 
console.log(String(value3)); // "null" 
console.log(String(value4)); // "undefined"

Symbol类型

表示独一无二的值

Object类型

toString()与valueOf的区别

两者并存的情况下,在数值运算中,优先调用了valueOf,字符串运算中优先调用toString()

let person = {
    name:'amy',
    age:12,
    toString:function(){
        return  this.name;
    },
    valueOf:function(){
        return this.age;
    }
}
const sentence = 'her name is ' + person;
const ageNew = 12  + person;
console.log(sentence);
console.log(ageNew); 

操作符

位操作符

进行位操作符时,先把数转为32位计算,结果再转为64位

8:正数存储 = 0000 0000 0000 0000 0000 0000 0001 0000

补码:反码加一

-8:负数存储= 1111 1111 1111 1111 1111 1111 1111 0000

  • ~ 波浪符
  • &和号
  • | 管道符
  • ^ 脱字符
  • << 左移
  • >>有符号右移动
  • >>>无符号右移

布尔操作符

  • &&
  • ||
  • !

乘性操作符

  • /
  • %

指数操作符

  • **

加性操作符

关系操作符

  • <
  • >
  • <=
  • >=

相等操作符

  • ==
  • !=
  • ===
  • !==

条件操作符

  • ? :

赋值操作符

  • *=
  • /=
  • %=
  • +=
  • -=
  • <<=
  • >>=
  • >>>=

逗号操作符

let num = (1,2,3,4,5,6);//num = 6;

let num = 1,num2=14,num3=17;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值