4.JavaScript数据类型

1.数据类型分类

        基础数据类型:Number,String,Boolean,Null,Undefined

        一些特殊的地方:Number里面的NaN,Null,Undefined

        引用数据类型:Object,Array,Function

     原始数据类型与引用数据类型:

        (1)作比较时,原始数据类型进行值比较,引用数据类型进行地址比较。

        (2)调用方法时,原始数据类型值不变,引用数据类型值要变。

        (3)原始数据存在于栈内存,引用数据类型存在于堆内存。

        (4)原始数据类型赋值时就是值,引用数据类型赋值时赋的是地址。

2.typeof操作符

        鉴于 ECMAScript 是松散类型的,因此需要有一种手段来检测给定变量的数据类型——typeof 就是负责提供这方面信息的操作符。对一个值使用 typeof 操作符会返回下列字符:

     typeof (值);                       

  • "undefined"——这个值是未定义;

  • "boolean"——这个值是布尔值;

  • "string"——这个值是字符串;

  • "number"——这个值是数值;

  • "object"——这个值是对象或 null;null会被识别为object,ECMAScript底层问题。

  • "function"——这个值是函数。

        数据类型在底层都是以二进制形式表示的,二进制的前三位为 0 会被 typeof 判定为对象类型,null为全0所以会被误判为"object",

  • 000 - 对象,数据是对象的应用

  • 1 - 整型,数据是31位带符号整数

  • 010 - 双精度类型,数据是双精度数字

  • 100 - 字符串,数据是字符串

  • 110 - 布尔类型,数据是布尔值

3.Undefined类型

 (1)只有一个值undefind。

 (2)在哪些情况会输出undefined。

  •         typeof一个未声明变量。

        

  •         声明变量未提升。(预编译阶段)

        

  •         函数没有返回值。(没有return)
  •         稀疏数组取empty([1,2,,,,3,,,4,]取稀疏数组里面的空值)。
  •         取属性未声明对象。
  •         转入实参数量小于形参数量,剩余形参为undefined。

4.null类型

  (1)只有一个值null。

  (2)null与undefined的区别:

          null==undefined,判断出来是true。但是他们的用途完全不同。

                undefined用于给一个初始量一个初始值。

                null用于意在保存对象的变量但还没有真正保存对象时。也可以叫做空指针

5.Boolean类型

    (1)false和true两个值。(大写是错误的)

    (2)转换为boolean类型时:

数据类型转换为true的值转换为false的值
Booleantruefalse
String任何非空字符串""(空字符串)
Number任何非零数字值(包括无穷大)±0和NaN(参见后面章节有关NaN的内容)
Object任何对象
Nullnull
Undefined

undefine

   (3)取反运算符也能将其他类型转换为boolean类型。

var a = null;
console.log(Boolean(a)); //false
console.log(!!null); //false

6.Number类型

(1)Number转换规则

  • 如果是数字值,只是简单的传入和返回。
  • 如果是 Boolean 值, true 和 false 将分别被转换为 1 和 0。

  • 如果是 null 值,返回 0。

  • 如果是 undefined,返回 NaN。

  • 如果是字符串,遵循下列规则:

    • 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即"1"会变成 1, "123"会变成 123,而"011"会变成 11(注意:前导的零被忽略了);

    • 如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);

    • 如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;

    • 如果字符串是空的(不包含任何字符),则将其转换为 0;

    • 如果字符串中包含除上述格式之外的字符,则将其转换为 NaN。

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

(2)parseInt()和parseFloat()

        parseInt(),用于取整,遇到字符串或者小数时,会取出“遇到字符或者小数点”值钱的纯数字。

var num1 = parseInt("1234blue"); 
var num2 = parseInt("");
var num3 = parseInt("0xA"); 
var num4 = parseInt(22.5); 
var num5 = parseInt("070"); 
var num6 = parseInt("70"); 
var num7 = parseInt("0xf"); 

 因为ES5无法将"070"识别成八进制,所以我们将引入第二个数字来表示前面的数作为一个几进制数,转换成10进制进行输出。没有第二个数字时,默认十进制。

var num = parseInt("0xAF", 16); //175,将“0xAF”作为一个16进制数,转换成10进制进行输出。
var num1=parseInt("123",16)//1*16^2+2*16+3

        parseFloat(), 可以识别前面讨论过的所有浮点数值格式,也包括十进制整数格式。但十六进制格式的字符串则始终会被转换成 0。 如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是零) , parseFloat()会返回整数。

(3)+(加)、-(减)、*(乘)、/(除),也会把类型转换成数字。
        只有加法在遇见字符串时会变成拼接而不是转换为数字类型。

(4)NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况。

特点:
    1. 任何涉及 NaN 的操作(例如 NaN/10)都会返回 NaN,这个特点在多步计算中有可能导致问题。
    2. NaN 与任何值都不相等,包括 NaN 本身。

isNaN()函数:
    用于判断数值是否是NaN,是NaN返回true 不是就返回false。
    如果检测的是非number类型,就会隐式的将这个值转换为Number类型,如果转换成功为数值isNaN()返回false,如果转换不成功就成为NaN isNaN()返回true。

(5)isInfinity(),是否是有穷数,是就返回true,否就返回false。

(6)浮点数的精度问题

        产生原因:大致意思是小数转换为二进制数时出现问题(现在的我还不是很懂,建议百度)。

        解决:

// 1、转化成整数进行计算
        var a = 0.1;
        var b = 0.2;
        if ((a*10 + b*10)/10 == 0.3){
         alert("You got 0.3.");
        }

// 2、设定保留的小数位,实际开发过程中保留2~3位小数位足够了
        (0.1 + 0.2).toFixed(3)          //toFixed是Math的方法

// 3、转化成整数Math.floor(a)、Math.ceil(a);
        // Math:ceil、floor、round、max、min、random、PI
        var a = 0.1456*100;
        console.log(a);

7.String类型

        字符串类型可以用""(双引号),''(单引号),``(反引号,ES6)来表示,反引号可以换行,并且书写方式与前两个不同。

        字符串一旦被创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个高寒新值的字符串填充改变量:

var lang = "Java";
lang = lang + "Script";
//加号:+,只要有一个是字符串,则全部作为字符串

1.转换为字符串 (toString)

   数值、布尔值、对象和字符串值变量都有 toString()方法。但 null 和 undefined 值没有这个方法,只能调用String()函数。

   toString一般情况不需要传参。但是在调用数字的toString()方法时,可以传递一个参数,将他转换成几进制的数输出。

var a = 31;
console.log(a.toString(16));//0x1f

2.转换为数组(split)

     将字符串以一个符号进行截断,把每一段都划成数组的一项。

var str = 'I like JavaScript';
var arr = str.split(' ');//转入的是单词之间空格
console.log(arr);//['I', 'like', 'JavaScript']
var str = 'I like JavaScript';
var arr = str.split('i');//传入哪个值哪个值就被当做分隔符
console.log(arr); //['I l', 'ke JavaScr', 'pt']

var str = 'I like JavaScript';
var arr = str.split('');
console.log(arr); 
// ['I', ' ', 'l', 'i', 'k', 'e', ' ', 'J', 'a', 'v', 'a', 'S', 'c', 'r', 'i', 'p', 't']

 当然,如果你传入不传值,str会被当成一个值传入数组。

var str = 'I like JavaScript';
var arr = str.split();
console.log(arr); //['I like JavaScript']

3.获取字符串长度(length)

var str = 'abcdefg';
console.log(str.length);//7
var str = 'abcdefg';
console.log(str[str.length-1]);//g

第二段代码展示了length的用法,并且使用了一个新方法取出了字符串中的字符。 (取下标)

 4.返回某个指定字符串在字符串中首次出现的位置(indexOf)

str.indexOf(str1,start):查子字符串的第一个字符在当前字符串中的索引为止,前提是查找中有完整的子字符串:

        str1:必填,要查询的子字符串。

        start:可选,从哪个位置开始查询,如果不写,默认从首位开始查询。

        返回值:返回第一个字符串守字母出现的下标,如果没有返回-1。

str.lastindexOf(str1,start):与第一个相同,只是位置是反向查询的。

var str = 'abcdefabcdef';        
console.log(str.indexOf('f', 1)); //5 //从下标为1的值开始查询
console.log(str.lastIndexOf('f'));//11

         如果此时我输入

console.log(str.lastIndexOf('f',6));

那么他的值是多少呢?

5.截取字符串(substring,slice,substr)

 substring(start,end) 截取start到end之间的子字符串

            start: 必须,开始截取的位置。

            end:结束,截取结束位置,如果不传,会一直截取到末尾。

            返回值:[x,y)。

--------------------------------------------------------------------------------------------------------------------------

 substr(str,length) 从指定位置截取指定长度的字符串

            str:必须 开始位置。

            如果str为负数,那么会从后开始数到这个位置,再开始截取。

            length:可选(option) 指定长度。

--------------------------------------------------------------------------------------------------------------------------

 slice(start,end) 截取start到end之间的子字符串

        与substring相同,但是能取负值。

        截取方向是从左往右。

var str = '1234567890';
console.log(str.substring(5, 9)); //6789
console.log(str.substring(5)); //67890
console.log(str.substring(9, 5)); //6789
console.log(str.substr(-9, 5)); //23456
console.log(str.substr(2, 5)); //34567
console.log(str.slice(2, 5)); //345
console.log(str.slice(-9, 5)); //2345
console.log(str.slice(-9, -2)); //2345678

6.移除空格(trim)

var str = '       ds   dd         ';
console.log(str);
console.log(str.length);
var str1 = str.trim();
console.log(str1);
console.log(str1.length);

 

可以看出trim只能移除字符串两边的代码,并不能移除中间的代码。

7.返回指定位置的字符(charAt)

 var str = '123456hjk';
 console.log(str.charAt(3)); //4

charCodeAt(),这个是返回指定下标的字符的ASCII码值。

var str = '123456hjk';
/* 查找下标值对应的字符 */
console.log(str.charAt(3)); //4
/* 查找下标值对应的字符的ASCII码 */
console.log(str.charCodeAt(3)); //52

 将ASCII码值再转成对应的值:

   

var str = '123456hjk';
/* 查找下标值对应的字符 */
console.log(str.charAt(3)); //4

/* 查找下标值对应的字符的ASCII码 */
console.log(str.charCodeAt(3)); //52

/* 将ASCII码转成对应的字符 */
str1 = String.fromCharCode(str.charCodeAt(3))
console.log(str1); //4

/* toString(x)表示以x进制输出 */
console.log(str.charCodeAt(3).toString(8)); //64

        基础数据类型讲完 。

8.Object类型

        是一组数据和功能的集合。

1.创建方式:①使用new关键字创建,②直接使用{}创建。访问时,使用点语法(.)来访问

        obj.name;

        obj.age;

2.包装对象

   (1).含义:因为基础数据类型本身是没有方法的,为了能让它使用对象的方法,所以js会将基础数据类型包装成一个对象,再去调用它自身的方法,js后台会默认进行着一操作,在调用完方法后,这个包装对象就会被销毁。

        除了null和undefined,每个基础数据类型都有对应的包装对象:

         String为字符串基本类型。
   Nmber 为数值基本类型。
   Boolean 为布尔基本类型。

 (2)临时包装对象:当你需要添加一个属性时,他就会产生一个临时包装对象,当这个属性添加完毕后,这个临时包装对象就会被回收掉,添加在临时包装对象上的属性也会被回收掉,所以,如果你再去点这个属性是点不出来的。例如:

var s = "test";//这里会将s包装成一个String对象
s.len = 4; // 会给它设置一个属性
var t = s.len;
console.log(t);

 

       

        

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值