《三》Javascript 中的基本类型

JavaScript 中的数据类型可以分为两大类:基本类型和引用类型。

基本类型中有 5 种数据类型: String、Number、Boolean、Undefined、Null。引用类型中有 1 种数据类型:Object。

JavaScript 不支持创建任何自定义类型的机制,所以所有值都成为 6 种数据类型之一。

不同数据类型在计算过程中会自动进行转换:
数字 + 字符串:数字转换为字符串。
布尔值 + 字符串:布尔值转换为字符串。
布尔值+ 数字:布尔值转换为数字。
布尔值+布尔值:布尔值转换为数字。

可以进行类型检测来确认属于哪种数据类型:

  1. typeof:可以使用 typeof 运算符来检测一个值或者变量的数据类型。
    语法: typeof 值或变量,返回的是数据类型的小写字符串表达。字符串返回 'string';数值返回 'number';布尔值返回 'boolean';未定义值返回 'undefined';对象或 null 返回 'object';函数返回 'function'

    typeof 不是一个函数,而是一个内置的操作符。
    数据类型首字母大写,typeof 返回的类型字符串小写。
    typeof 在检测基本数据类型的时候好用,但检测引用类型的时候,并不能具体检测到到底是什么类型的 Object 对象。

    console.log(typeof 5); // ”number“
    
    var name = 'Lee'
    console.log(typeof name); // ”string“
    
  2. instanceof:使用 instanceof 运算符检测引用类型,来判断对象的具体类型。
    语法:A instanceof B,实例对象 A 是否是构造函数 B 的实例。如果 B 函数的原型对象在 A 对象的原型链上,就返回 true,否则返回 false。
    function Foo(){}
    var f1 = new Foo()
    console.log(f1 instanceof Foo) // true
    console.log(f1 instanceof Object) // true。这是因为 Object.prototype 是原型链的终点
    

String 字符串类型:

使用单引号或者双引号括起来的一个或多个字符就是字符串。

字符串类型包含了一些特殊的字符字面量:转义序列,即以反斜杠开头的不可显示的特殊字符。
\b:退格(将当前位置移到前一列)
\f:换页(将当前位置移到下页开头)
\n:换行(将当前位置移到下行开头)
\r:回车(将当前位置移到本行开头)
\t:水平制表(跳到下个 TAB 位置)
\v:垂直制表
\\:代表一个反斜杠”\”
\’:代表一个单引号
\”:代表一个双引号
\0:空字符

var str = '你好\n世界'
var str = ”hello”;

属性:

  1. length:返回 string 的长度,代表的是字符串中字符的个数。每个汉字、英文字母、符号、空格都按一个字符算。
    // 判断字符串长度:
    var len = 0;  
    for (var i=0; i<this.length; i++) {  
          if (this.charCodeAt(i)>127 || this.charCodeAt(i)==94) {  
                len += 2;  
           } else {  
               len ++;  
           }  
    }  
    return len;  
    
  2. 数值下标:字符串可以使用方括号内下下标的形式,访问某个字符。
    var str = '你好,世界'
    console.log(str[1]) // 好
    

方法:

  1. 通用方法:
    str.toString()str.toLocaleString()str.valueOf() 都返回字符串的基本值。

    toString():转换为字符串。使用toString()方法,除了null和undefined,其他数据类型都可以转换为string类型。一般是不需要传参的,但在数值转换成字符串的时候可以传递进制参数。
    如果在转型之前不知道变量是否是null或undefined的情况下,可以使用转型函数String()。如果值有toString()方法,则自动调用该方法并返回相应的结果;如果是null和undefined,则返回’null’和’undefined’。能够将任何类型的值转换成字符串。

    var box=10;
    alert(box.toString());//弹出’10’
    alert(box.toString(2));//弹出’1010’,转成2进制
    
  2. 大小写转换方法:
    str.toLowerCase():将字符串全部转换为小写。
    str.toUpperCase():将字符串全部转换为大写。
    str.toLocaleLowerCase():将字符串全部转换为小写,并且本地化。
    str.toLocaleUpperCase():将字符串全部转换为大写,并且本地化。

    只有几种语言具有地方特有的大小写本地化,一般来说,是否本地化效果都一致。

  3. 字符方法:
    str.charAt(index):返回指定索引位置的字符,索引从 0 开始。索引位置超出字符串长度则返回空字符串
    str.charCodeAt(index):返回指定索引位置字符的 Unicode 编码,索引从 0 开始。

    var str=”hello”;
    console.log(str.charAt(1)); // “e”
    console.log(str[1]); // 通过数组方式获取,但在 IE 浏览器会显示 undefined,使用需谨慎。
    
  4. 位置方法:
    str.indexOf(char):返回指定字符在字符串中首次出现的位置,如果没有找到则返回 -1。从前往后搜索,索引值从 0 开始。
    str.lastIndexOf(char):返回指定字符在字符串中首次出现的位置,如果没有找到则返回 -1。从后往前搜索,但返回的位置的数字仍是从前面开始数的,索引值从 0 开始。

    可以传入第二个参数 n,表示开始查找的位置索引。

    var str = "123456389";
    console.log(str.indexOf("3")); // 2
    console.log(str.lastIndexOf("3")); // 6
    
    //找出全部的 L
    var box=’Mr.Lee is Lee’
    var boxArr=[];
    var pos=box.indexOf(‘L’);
    while(pos>-1){
      boxArr.push(pos);
      pos=box.indexOf(‘L’,pos+1);
    }
    consolr.log(boxArr);
    
  5. 操作方法:

    • str.concat():拼接字符串。

    • str.replace(findstr,tostr):替换子字符串。findstr:要替换的字符串。tostr:替换后的字符串。

    • str.split(bystr,limit):拆分子字符串为数组。bystr:分隔符。limit:返回的数组的最大长度,可省略。

      var str=”1,2,3,4”;
      var strArray=str1.split(“,”);
      alert(strArray);//返回[1,2,3,4]
      
    • str.substr(start, length):获取子串,返回从 start 位置开始的长度为 length 的子串。索引值从 0 开始。如果省略 length,则返回从 start 开始到结尾的子字符串。参数支持负数。

       var name = ’Mr.Lee’;
       // 第一个参数为负数的话,表示倒数,最后一位是 -1,然后是 -2,以此类推,但是长度仍然是从前往后数。
       console.log(name.substr(-3, 2)); // Le。
      

      str.substring(from, to):获取子串,返回从 from 开始位置到 to 结束位置之间,不包含 to 的子串。索引值从 0 开始。如果省略 to,则返回从 from 开始到结尾的子字符串。参数不支持负数,会默认转为 0。

      var name = ’Mr.Lee’;
      
      // substring() 第二个参数可以小于第一个参数,将自动把较小的数字调整到前面
      console.log(name.substring(3, 0)); // Mr.。(3, 0) 变为 (0, 3)。
      
      // substring() 不支持负数,会默认转为 0。
      console.log(name.substring(-3)); // Mr.Lee。-3 转为 0,返回从 0 开始到结尾的子字符串。
      console.log(name.substring(3,-1)); // Mr.。-1 转为 0,并且把较小的数字提前变为 (0, 3)。
      

      str.slice(from, to):获取子串,返回从 from 开始位置到 to 结束位置之间,不包含 to 的子串。索引值从 0 开始。如果省略 to,则返回从 from 开始到结尾的子字符串。参数支持负数。

       var name = ’Mr.Lee’;
      
      // slice() 第二个参数必须大于第一个参数
      console.log(str.slice(3, 0)); // 返回空字符串
      
      // slice() 支持负数,参数为负数的话表示倒数,最后一位是 -1,然后是 -2,以此类推。
       console.log(name.slice(-3, -1)); // Le。
      

      总结:
      substr() 的第二个参数是子字符串的长度,而不是位置编号。
      substring() 和 slice() 的功能基本一致,都是获取从开始位置到结束位置的子字符串。区别是:

      1. substring() 可以自动交换两个参数的位置,而 slice() 不行。
      2. slice() 参数可以是负数,substring() 不行。
      //去掉第一个和最后一个字符,获取到中间的元素
      var str = '1哈哈哈1';
      
      console.log(str.substr(1, str.length -1 ));
      console.log(str.slice(1,-1));
      
    • str.trim() :删除字符串两端的空白符。

      var str = "   Hello World!  ";
      console.log(str.trim());
      
  6. 字符串的模式匹配方法:

    • str.search(str/RegExp):返回在字符串中与正则表达式匹配的字符的开始位置。和 indexOf() 一样。
    • str.match(str/RegExp):以数组的形式返回在字符串中与正则表达式匹配的字符。

静态方法:

String():转换函数,强制转换为字符串类型。

Number 数字类型:

JavaScript 中的数字类型类型分为整型和浮点型。所有数字都采用 64 位浮点格式存储。

对于过大或过小的数值可以使用科学计数法 。例如:300000000 可以写成 3e8,表示 3 乘以 10 的 8 次方。

  1. 整型:十进制、二进制、八进制、十六进制。

    二进制以 0b 开头,后面是 0-1
    八进制前导是 0, 后面是 0-7
    十六进制前面两位必须是 0x,后面是 0-9A-F(大小写都行)。
    无论是什么进制,输出都是按十进制。

    var num1 = 070; // 有效的八进制
    console.log(num1); //  56
    var num2 = 08 // 无效的八进制
    console.log(num2) // 自动解析为 8
    
  2. 浮点型:整数部分加小数部分组成,只能用十进制来表示。

    浮点数中零点几的零可以省略不写。例如: 0.15 可以写成 .5

    由于保存浮点数值需要的内存空间比整型数值大两倍,因此 ECMAScript 会自动将可以转换为整型的浮点数值转换为整型。

    Javascript 使用了 IEEE754 二进制浮点数算术标准,这会使得一些个别的小数运算产生精度丢失的问题。例如: 0.1 + 0.2 // 0.30000000000000004
    可以在进行小数运算时,通过调用数字的 toFixed() 方法保留指定的小数位数来解决。

    var num1 = 0.15; 
    

静态属性:

静态属性:可以直接通过 Number 这个类型名称来调用的属性。

  1. MAX_VALUE:表示最大值。
    MIN_VALUE:表示最小值。
    console.log(Number.MAX_ALUE);//1.7976931348623157e+308
    console.log(Number.MIN_VALUE);//5e-324
    
    //如果超过范围,就会出现Infinity(正无穷)或-Infinity(负无穷)。
    var box=100e1000;
    console.log(box);//弹出Infinity
    
  2. POSITIVE_INFINITY:表示正无穷大。
    NEGATIVE_INFINITY:表示负无穷大。
    console.log(Number.POSITIVE_INFINITY);//infinity
    
  3. NaN:是英语 not a number 的意思,不是一个数字。用于表示一个本来要返回数值却未返回数值的情况。

    可以通过 Number.NaN 得到 NaN 值。
    在数学运算中,如果结果不能得到数字,那么就会得到 NaN。例如:0 除以 0。
    任何与 NaN 进行运算的结果均为 NaN;
    NaN 不与任何值相等,包括自身;

    console.log(Number.NaN); // NaN
    console.log(0/0); // NaN
    console.log(NaN+1); / /NaN
    console.log(NaN == NaN); // false
    

静态方法:

  1. Number():转型函数,强制转换为数字类型。

    • String 类型:如果只包含数值,则直接转换为数值;如果字符串为空,则转为 0;其他的字符串都转换为 NaN。
    • Boolean 类型:true 转换为 1,false 转换为 0。
    • Undefined 类型:转换为 NaN。
    • Null 类型:转换为 0。
    • Object 类型:对象都转化为 NaN。
    console.log(Number(‘12’)); // 12
    console.log(Number(‘’)); // 0
    console.log(Number(‘你好’)); // NaN
    
  2. parseInt() 和 parseFloat():用于把字符串转换为数值。parseInt() 用于整数转换,除了能识别十进制,也能识别八进制和十六进制。parseFloat() 用于浮点数值转换,不能识别八进制和十六进制。第一个参数是字符串,第二个参数是用于表明第一个参数是什么进制的。

    console.log(parseInt(‘12.34’)); // 12。会自动截掉第一个非数字字符之后的所有字符
    console.log(parseInt(‘12Lee34’)); // 12。会自动截掉第一个非数字字符之后的所有字符
    console.log(parseInt(‘Lee12’)); // NaN。不是以数字开头,返回 NaN
    console.log(parseInt(‘’)); // NaN。不是以数字开头,返回 NaN
    // ECMAScript 为 parseInt() 提供了第二个参数,指定进制。
    console.log(parseInt(‘AF’,16)); // 175。第二参数指定十六进制,可以去掉 0x 前导
    
    console.log(parseFloat('12.34')); // 12.34
    console.log(parseFloat('12.34.56')); // 12.34,只认一个小数点。会自动截掉第一个非数字字符、非小数点之后的所有字符
    console.log(parseFloat('12Lee34')); // 12。会自动截掉第一个非数字字符、非小数点之后的所有字符
    console.log(parseFloat('Lee12')); // NaN。不是以数字开头,返回 NaN
    console.log(parseFloat('')); // NaN。不是以数字开头,返回 NaN
    console.log(parseFloat(‘0xA’)); //0。不认十六进制
    
  3. isFinite():确定一个数值是否超过了规定范围,没有超过返回 true,超过了返回 false。

    var box=100e10;
    console.log(isFinite(box)); // true
    
  4. isNaN():判断是否不是数值。如果不是数值,返回 true;如果是数值,返回 false。isNaN() 函数在接收到一个值之后,会进行隐式类型转换,将这个值转换成数值。

    console.log(isNaN(‘25’)); // false,’25’是字符串数值,可以转成数值
    console.log(isNaN(true));/ / false,true可以转成1
    console.log(isNaN(‘你好’)); // true,小米不能转成数值
    

方法:

  1. num.toString()num.toLocaleString()

  2. num.toFixed(digit):数字转换为字符串,并保留小数点后指定的位数,不足用 0 补足。

    toFixed() 不是已四舍五入的方法进行取舍的,而是使用银行家舍入法进行取舍的,其实质是一种四舍六入五考虑的方法:

    1. 当舍去位的数值 <= 4 时,直接舍去。
    2. 当舍去位的数值 >= 6 时,在舍去的同时向前进一位。
    3. 当舍去位的数值 = 5 时:
    • 5 后面的位不为空,且不全为 0, 在舍去的同时向前进一位。
    • 5 后面的位为空或全为 0 :
    • 5 前面的位为奇数,在舍去的同时向前进一位。
    • 5 前面的位为偶数,直接舍去。

    也就是:四舍六入五考虑;五后非零就进一;五后为零看奇偶,五前为奇要进一,五前为偶就舍去。

    // 使数字按字符串类型相加:
    var a = 1;
    var b = 2;
    var c = a + ”” + b; // 12
    

Boolean 布尔类型:

JavaScript 中的布尔类型只有两个:true 和 false,用来表示真和假。

静态方法:

Boolean():转型函数,强制转换为布尔类型。

  • String 类型:任何非空字符串转换为 true,空字符串转换为 false。
  • Number 类型:0 和 NaN 转换为 false,其他转换为 true。
  • Undefined 类型:undefined 转换为 false。
  • Null 类型:null 转换为 false。
  • Object 类型:任何对象都转换为 true。
var box="小米";
console.log(Boolean(box)); // true

String、Number、Boolean 是基本类型,但又是特殊的引用类型,因为可以调用内置方法,所以叫做基本包装类型。实际上,每当读取一个基本包装类型的时候,后台就会创建基本包装类型对应的一个对象,从而能够调用一些方法来操作这些数据。
基本包装类型无法给自己创建属性和方法,但可以调用系统内置的方法。

//字面量方式:
var box="你好"; // 基本类型
box.name="铛铛"; // 给基本类型添加属性,无效
box.age=function(){
   return 20;
}; // 给基本类型添加方法,无效

alert(typeof box); // string
alert(box.substring(1)); // 好
alert(box.name); // undefined
alert(box.age()); // 出错
// 使用 new 运算符:不推荐,因为会导致分不清到底是基本类型还是引用类型
var box=new String(‘你好’); // 引用类型,String 的引用类型
box.name=’铛铛’; // 给引用类型添加属性,有效
box.age=function(){
    return 20;
}; // 给引用类型添加方法,有效

alert(typeof box); // object类型
alert(box.substring(1)) ;// 铛铛
alert(box.name);
alert(box.age());

Undefined 未定义值类型:

已经声名但是没有赋值的变量。Undefined 类型只有一个值,就是 undefined。

var a
console.log(a) // undefined 
console.log(age) // 报错

// 但 typeof a, typeof age 返回的都是 undefined。

undefined 源生自 null,因此 ECMA262 规定对它们的相等性测试返回 true。

console.log(undefined == null) // true
console.log(undefined === null) // false,因为数据类型不同

Null 空值类型:

表示一个空对象指针,用于定义空的或者不存在的引用,所以 typeof 会返回 Object。Null 类型只有一个值,就是 null。

var a = null;

可以初始赋值的时候给变量赋值为 null,表明后续将要赋值为对象;也可以通过给一个变量赋值 null 来清除变量的内容。

// 初始赋值为 null,表明将要赋值为对象
var box = null
box = {
    name:’Lee’
}

// 让 box 指向 null,切断了 box 与之前对象的连接,之前那个对象没有变量再去引用指向它了,就成了垃圾对象,会被垃圾回收器回收,释放所占用的内存
box = null 

Object 引用类型:

引用类型 Object 是一种数据结构,引用类型 Object 的值(对象)是引用类型的实例。

任意对象都是 Object 类型。Object、Array、Function、RegExp、Date、特殊的基本包装类型(String、Number、Boolean)以及内置对象(Global、Math) 等都属于 Object 类型。

var obj = {}
var arr = []
var fn = function () {}
var reg = new RegExp()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值