JS1数据类型及转换
-
数据类型
(1)原始数据类型(存储于栈内存):数字、字符串、布尔型、null、undefined (2)引用类型(存储于堆内存):数组、函数、对象
-
JS数据存储形式:
栈是把空间分好了的。若var a=100;var b=a 操作时,会给a一个空间,也会给b一个空间
堆是自己申请,有一个地址暂存区域(变量指向地址,地址指向值),然后堆给你一个地址,然后去访问, 若var arr=【1,2,3】 var brr=arr 操作时,只是把arr的地址给了brr -
typeof
(1)typeof操作数据结果可能是number,string,boolear,undefined,object (2)typeof 操作结果的typeof值一定为string类型(typeof (typeof 值 ) =string) (3)引用类型是函数则typeof结果为function 其他为object (4)typeof的优先级高于除法
-
出现undefined的情况
(1)当一个变量存在但是没有值的时候会返回undefined (2)当函数被调用,但是没有返回值(return)的时候,该函数调用表达式的结果就是undefined
-
转换成boolean类型(用boolean函数)
-
number类型
1)包含整数、小数,支持8/16/科学计数法 2)解决小数精度问题 (1)小数换成整数(0.1*10+0.2*10)/10 (2)将小数保留固定的小数位(用在价格上(0.1+0.2).toFixed(5)保留5位 (3)只保留整数.math.floor(0.1+0.2)向下取整. math.ceil(0.1+0.2)向上取整 math.round(0.1+0.2)四舍五入
-
转换成number类型(用number函数)
(1)只有数字,直接转换。 console.log( Number(10) )//10 (2)boolean类型true为1 false为0 。 console.log(Number(true) )//1 console.log( Number(false) )//0 (3)null为0 。 console.log( Number(null) )//0 (4)//undefined为NAN 。 console.log( Number(undefined) )//nan (5)//string类型只有数字时直接转换,空字符时为0,其他字符时为Nan console.log( Number(" 12 ") )//12 console.log( Number("") )//0 console.log( Number("asdad") )//nan (6)//引用类型时,优先调用valuesof方法,再调用tostring方法 var z=[100,200]; console.log( z.valueOf() );//[100,200] console.log( z.toString() );//100,200 console.log( Number(z) );NaN (7) 如果是字符串,遵循下列规则: 如果字符串中包含有效的十六进制格式,例如"0xf", 则将其转换为相同大小的十进制整数值; 如果是对象,则调用对象的 valueOf()方法,然后依 照前面的规则转换返回的值。如果转换的结果是 NaN, 则调用对象的 toString()方法,
-
NaN的特点
(1)与任何数都不相等,与自己都不相等 (2)参与任何运算的时候,结果都是NaN ()例如:var a=NaN; if(a==NaN){ console.log("我是NaN"); } **这句话是不会执行的**
-
number隐性转换
(1)console.log(nan/100) console.log("number"/100) //nan (2)console.log(isnan(“asd”)) //true(先对“asd”进行number转 换,然后判定) console.log(isnan(“”))//false (3)var arr=[ ] console.log(isnan(arr))//false
-
isNaN的用法
-
转换number的其他方法
1)parseInt():从前往后读取数字,遇到非数字则停止读取 (1) var str="12s2"; console.log( number(str) )//NaN console.log( parseInt(str) );//12 console.log( number("") )//0 console.log( parseInt("") );//NaN (2)支持传递两个参数,支持2/8/10/16进制 console.log( parseInt(“070”,16) );//112 。16进制 console.log( parseInt("070") )//70 默认为10进制 console.log( parseInt("070",0) )//70 写0则自动为10进制 2)parseFloat()从前往后读取符合小数数字的字符,支持10进制和科学计数法 console.log( parseFloat("12.as45")//12 console.log( parseFloat("12.45as45")//12.45
-
String类型
(1)转义:JS转义:\ 和 \n css转义: <(小于) >(大于) (空格) (2)变量.length获取变量长度 (3) 原始类型值 不可更改(若var a=100; a=200; a输出结果为200 只是a所指向的区域变成了200所申请的区域,100的区域依然存在,100这个值没有改变) (4)es6支持反向引号,支持内容换行。双引号与单引号不支持换行。 console.log(`多行 字符串 测试`); var name = '小明'; var age = 20; var message = `你好, ${name}, 你今年${age}岁了!`; alert(message);
-
转换成String
(1)toString()方法,能转换大部分类型(null和undefined不行,这两个可以使用拼接) var a=100; console.log( a.toString() ); console.log( null+" " ); (2)String()函数(可以转换所有) console.log( String( undefined) );
-
函数 (JS函数不调用不执行,函数体里面的语句在哪里定义就在哪里运行)
-
字符串方法
-
indexOf(“查找的字符”,开始位置)方法,查找字符串中指定字符第一次出现的位置(可以接收2个参数)(若找不到指定字符则返回-1)
var a=“asdas”;
console.log( e.indexOf(“f”,2) );从第二个字符开始查找 f
2)substring(开始下标,结束下标) 截取方法,当开始下标大于结束下标的时候,会自动调换位置。
3)其他方法
substr(开始位置,截取长度)截取方法
slice(开始位置,结束位置)截取方法,不会自动调换位置,但是可以支持负数。
trim()可以去掉字符串前面和后面的空格
charAt(index)从字符串中取某个位置特定的字符
charCodeAt(index)从字符串里取某个特定位置的字符编码
4)与indexOf联用
-
-
object类型
1)构建对象方法 (1)var obj1={ name:xt, age:21, sayhello:function(){ console.log("hello"); } } (2) var obj2=new object; obj2.name="xt"; obj2.age="21"; 2)访问对象方法 (1)console.log( 对象名.属性名 ) (2)console.log( 对象名[ " 属性名" ] ) (当不确定访问哪个属性时 ,在括号中放变量可以访问)
-
包装对象(var a=new boolean / string / number)
-
变量作用域
(1)在函数体内用var声明的变量是局部变量,直接声明的变量是全局变量。 (2)函数体内调用变量,优先调用函数体内局域变量。 (3)变量声明只声明一次(对象的属性是唯一的),再用到的时候只是进行改变。 (4)函数体内可以用全局变量,函数体外不能使用函数体内的变量。 (5)函数体内没有但是需要用到的变量,就向上一级访问变量。
-
表达式
(1)函数 / 数组 / object对象 调用valueof()方法,结果是它本身
(2)函数 / 数组 / object对象 与数字相加,结果是字符串拼接.
例题:
(1)包装对象
tostring()是一个方法(即就是一个函数),那么,a.tostring()是调用函数,而a.tostring是查看函数体。
test8090.tostring=100;是改变了test8090的tostring属性,(但是tostring之前是一个函数),现在变成了100,那么之后再用tostring()方法 的时候,是调用了100这个值,他不是函数,所以不能调用,所以出错。
(2)只有一function开头的才能函数提升
(3)% 取余符用法(点击变色)
(4)时间获取
(5)时间差