Js中基本数据类型:

undefined null string boolean number

      复杂类型:

object function date reg(正则)  [] (数组)

   检测:

  typeof  * ;

 

一、字符串类型

属性1: length

 

转义: 

\n 换行  \> 转义>  \* 转义符号

 

类型转换:

toString() ;   =>string

     适用于: Number/Boolean/String/Object

String():  

       null. Undefined (他们两个没有tostring方法)

 

     eval():

计算字符串表达式的值并以数值形式返回;

 

//eval
var evalVal="1+2+5+8+10";
console.log(typeof evalVal);//string
var evalComputed=eval(evalVal);
console.log(evalComputed,typeof evalComputed);//26 "number"

 

 

二、number

 

包含:正数、负数、零、小数、以及特殊的NaN;

 

我们用的都是十进制

 

关于NAN

  • Not a Number
  • 非数值,不是一个数值,但是NaN属于数值类型;
  • 特点
    • 任何涉及NaN的操作都将返回NaN
    • NaN与任何数值都不相等包括其自身
      console.log(NaN==NaN) /false
    • 0 == NAN //false

 

检测 isNaN

  • 可以转换为数值,为false
  • 不能转换为数值,为true

NaN:not a number不是一个数;但是属于number数据类型;用typeof检测的返回结果是number;NaN和NaN不相等;例如:NaN==NaN-->false;typeof NaN 等于:number;

 

 

 

常用方法:

 

Number()  要求数值必须是纯数字 number(123);

parseInt()  从前往后开始:会忽略浮点号;遇到第一个非数值的符号后直接退出转换,其中"."也是不合法的数值符号): 遇到非数字就结束

  • parseFloat()   可以转换为浮点数123.12dw可以转换为123.12;

隐式转换: + - 

 

number.toFixed(num)  保留num位小数

Math.ceil(num)    向上取整

Math.floor(num)    向下取整

 

number([1,2,3])// NAN

parseInt([1,2,3]) // 1

parseFloat([1,2,3]) // 1

 

number(true) // 1

number(false) // 0

number(‘’) // 0

number(‘  ‘) // 0

number(‘   111ss’) // nan

number(‘   7777’) //7777

number(’99’) // 99

 

 

 

注意点:

  • Boolean转换为数值的时候
    • true转为1;
    • flase转为0;
  • null转换为数值的时候 转换为0
  • undefined转换为数值的时候 转为NaN

 

string转换为数值的时候

  • 如果只包含数字
    • 转为十进制数
    • 前导0被忽略
  • 如果包含有效浮点格式
    • 浮点数值
    • 忽略前导0
  • 包含有效十六进制格式;相同大小的十六进制整数
  • 空字符串转为0;备注:""是空字符串 " "这个就不是空字符串了
  • 其他格式字符串NaN

 

Object 

调用对象的valueOf()方法,然后依照前面的规则转换返回的值,如果转换的结果是NAN,则调用对应的toString方法,然后再次依照前面的规则转换返回的字符串值;

  • ValueOf()
  • ToString()

 

三、boolean

 

  • rue为真,flase为假(false是布尔值,而Flase只是标识符);通常用在if/else的判断语句中(如果需要的话,通常还会配合逻辑与&&,逻辑或||来完成)
  • true不一定=1;flase不一定=0;

        False == 0   //true

       False  === 0  //false

 

  • 使用boolean()进行转换;
  • 任何数据类型的值调用Boolean()函数,都会返回一个Boolean值;也可以用(!/!!来转换)
    • 转为true的
      • Boolean的true本身
      • 任何非空字符串
      • 任何非零数值
      • 对象
    • 转换为flase
      • false本身
      • 空字符串
      • 0和NaN(0=-0吗?可以输出看一下,是等于的)
            console.log(0===(-0));//true
      • null和undefined;

为false值:

false本身、空字符串、0、NaN、null、undefined;这些值要记住,很重要;

 

Null === undefined //false   null == undefined //true

 

 

关于类型的比较:

  对象比较: 【】 == 【】//false   内存的地址不同

  对象和字符串  先转换为字符串 toString()// arr

  对象和布尔类型   number()  先转为数字

  对象和数字 同上

  数字和布尔 同

  布尔和字符串 同

  Null 和undefined   //true

  Null / undefined  和任何其他类型比较 都为 !!! False   因为他们没有tostring() 方法

False == null //false

 

0.1+0.2 == 0.3 //false

 0.30000000000000004 == 0.3 

 

四、null 和 undefined

null是空值,是一个空指针,一般表示一个变量定义了但是没有值(值为空);undefined是未定义;

 

  • null(空值,曾经赋过值,但是目前没有值)
    • 逻辑上null表示一个空对象的指针
    • 使用typeof检测的时候会返回object;(object原型的终点也是null)
  • undefined(没有值,指从没有赋过值)
    • 使用var声明变量但没有初始化/赋值的
    • 区分空对象指针与尚未定义的变量
    • 对未初始化的变量以及未声明的变量使用typeof运算符均会返回undefined;

意思是说: var a; // undefined    console.log(b)  //b not defined

 

Null是特殊的关键字 undefined是标识符

Null 是obj类型。  undefined是undefined类型

不要声明 null 和 undefined的变量, 声明的时候,变量值时null,应该主动用null来负值而不是undefined

 

注意: 在函数里,如果函数没有返回值(比如return return空值) 那么它会输出undefined , 有返回但是计算不出或者不存在 返回null (Document.getElementById(“div1”)//返回null)

 

 

五、object

 

Object类型包括,数组、正则等等;

  • 定义:一组数据或功能的集合
  • 声明
    • var o=new Object()//Object后面的()可以省略,但不推荐
    • var o={}
  • 属性和方法
    • constructor:保存用于创建当前对象的函数,构造函数就是Object()
    • HasOwnProperty(propertyName) 检测给定输定在当前对象实例中是否存在(而不是实例的原型中)
    • isPrototypeOf(object) :检测传入的对象是否是另一个对象的原型(而不是在实例中);
    • propertyIsEnumerable(propertyName);检测给定属性是否能用for-in语句每句来枚举;
    • toLocaleString() 返回对象的字符串表示,该字符串与执行环境的地区对应;
    • toString() 返回对象的字符串表示
    • valueOf() 返回对象的字符串,数值或布尔值表示;通常与toString()的值相同;
    • 在ECMAScript中,Object是所有对象的基础,因此所有对象都具有这些基本的属性和方法;方法的具体原理,后面数据类型和原型链中具体说;
    • BOM/DOM中的对象,都是属于宿主对象,因为他们是由宿主实现提供和定义的,但是ECMAScript不负责定义宿主对象,因此宿主对象可能会也可能不会继承Object;

 

 

六、symbol

Symbol 是JavaScript的原始数据类型,Symbol实例是唯一且不可改变的.可以作为对象属性的标识符使用;

在没有ES6的时候,属性名是很容易被覆盖的;

 

为了从根本上防止属性名的冲突,就是ES6引入Symbol的原因。

在其他编程语言中 symbol也被称为原子(atoms).

在JavaScript中, Symbol 是 基本数据类型 的一种,Symbol 对象是 Symbol原始值的封装 ,Symbol 类型是 ECMAScript 6 (es6) 中新添加的特性,在ECMAScript 5中没有对应的类型。

Symbol值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型;

 

一是原来就有的字符串, 二是新增的Symbol类型。凡是属性名属于Symbol类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。

let aloneVal = Symbol();//注意不要用new来生成new;

console.log(typeof aloneVal);//symbol

 

 

Symbol里面的参数,是描述使用的;仅仅是为了控制输出时候方便识别,没有别的用了;

const s1 = Symbol('foo');

const s2 = Symbol('bar');

console.log(s1,s2);//Symbol(foo) Symbol(bar)

 

//Symbol不可以进行运算,但是可以转换为字符串和布尔值,但是不能转为数值;

const sym=Symbol("flag");

//console.log(sym+"hello baby");// Cannot convert a Symbol value to a string

console.log(String(sym)+"hello one");//Symbol(flag)hello one

console.log(sym.toString()+"hello two");//Symbol(flag)hello two

console.log(Boolean(sym),typeof Boolean(sym));//true "boolean"

console.log(Number(sym));//Cannot convert a Symbol value to a number