为了能更好的操作基本类型值,JavaScript提供了3个特殊的引用类型:Boolean,Number和String。这些引用类型和传统对象相似,有自己的属性和方法,但也具备各自的特殊行为。
一 基本包装类型简介
我们知道,基本类型的值是没有属性和方法的,不能被改变的。但是上面3个特殊的引用类型赋予了可以操作基本类型值的方法:
var str1 = "hello world"; var str2 = str1.sunstring(5);
从上面代码我们知道,str1是一个基本类型的字符串,但我们却用它调用了一个方法,并把返回值赋值给了str2。照理说基本类型值是没有方法的,那么这个操作是怎么实现的呢?
实际上JavaScript在读取一个基本类型值时,后台会有如下操作:
1, 创建基本包装类型(这里是String类型)的一个实例。
2, 在该实例上调用相关方法。
3, 立即销毁该实例。
所以实际上str1在调用方法时可以理解为执行了如下过程:
var s1 = new String(str1); var str2 = s1.substring(5); s1 = null;
注意:以上操作都是后台完成,我们并不能察觉到它。
普通引用类型和基本包装类型的主要区别在于对象的生存周期,使用new 操作符创建的对象在程序执行流离开当前作用域之前一直都存在于内存中,而后台创建的基本包装类型的对象只存在于一行代码的执行瞬间,而后立即被销毁了。这意味着我们可以为基本类型的值添加属性和方法,但最终他们不会被保留。
var str = "hello";
str.name = "someText";
str.say = function(){
//some code;
};
console.log(str.name);//undefined
str.say();//TypeError: str.say is not a function
再看下面的代码:
var str = new String("hello");
typeof str;//"object"
console.log(str);//{0:"h",1:"e",2:"l",3:"l",4:"o",length:5}
可以看到,尽管可以显示的创建基本包装类型对象,但它完全背离了我们使用字符串类型来存储文本信息的初衷,所以,如无特别必要,我们建议不要显式的创建和使用它。
二 Boolean类型
Boolean类型是布尔值对应的引用类型。要创建Boolean对象可以像下面这样:
var BooleanObj = new Boolean(false);
但是有一个问题,请看下面代码:
var booleanObj = new Boolean(false); var result = booleanObj && true; console.log(result);//true
虽然booleanObj的值是false,但它本身是一个对象,我们知道,在进行逻辑运算时会触发隐式类型转换,所有对象都被转换为true,所以最终result的值为true。但这并不是我们希望的结果,所以在工作中最好不要使用Boolean对象。
三 Number类型
Number类型是数字对应的引用类型。可以显式的创建数字对象,与Boolean类型一样,如果是用new创建数字值,使用typeof检测会返回“object”。
另外Number对象提供了两个实用的方法:
1, toFixed()
接受一个数字作为参数,表示需要保留几位小数,返回字符串类型的数字。
var num1 = 10.005;
console.log(num1.toFixed(2));//"10.01"
2, toExponential()
接受一个数字作为参数,表示需要保留的小数位数,返回以指数形式表示的数字,也是字符串类型。
var num = 10;
console.log(num.toExponential(1));//”1.0e+1”
四 String类型
String类型是字符串包装类型。也可以显式的是用new创建字符串对象。String类型的每一个实例都一个length属性,表示该字符串包含多少个字符。
var str = new String(“hello”);
console.log(str.length);//5
String类型提供了下列常用方法:
1, charAt()和charCodeAt()—获取某位置上的单个字符
var str = "hello world"; console.log(str.charAt(0));//"h",str的第一个字符 console.log(str.charAt(str.length - 1));//"d",str的最后一个字符 console.log(str.charCodeAt(0));//104,str第一个字符的编码 console.log(str.charCodeAt(str.length - 1));//100,str最后一个字符的编码
2, concat()—拼接字符串
var str1 = "hello"; var str2 = "world"; console.log(str1.concat(str2));//"helloworld" console.log(str2.concat(str1));//"worldhello"
3, substr()、substring()和slice()—复制字符串中的一部分
var str = "hello world";
console.log(str.substring(0,5));//"hello"
console.log(str.substring(0));//"hello world"
console.log(str.slice(6));//"world"
console.log(str.slice(4,7));//"o w"
console.log(str.substr(0,4));//"hello"
console.log(str.substr(0));//"hello world"
从上面的例子可以看出,substring()和slice()一样,可以接受两个参数,第一个参数是开始位置,第二个参数是结束位置,最终返回这两个参数区间内的字符串(不包含结束位置)。substr()和他们有一点不同,第二个参数是需要截取的字符串个数,而不是结束位置的下标。他们还有一个共同点:如果不提供第二个参数,那么他们都默认复制至末尾。
4, indexOf()和lastIndexOf()—查找子串在字符串中第一次出现的位置
var str = "hello world"; console.log(str.indexOf("l"));//2 console.log(str.lastIndexOf("l"));//9
indexOf()是从前往后查找,lastIndexOf则是从后往前查找。
5, toLowerCase()和toUpperCase()—大小写转换
var str = "hello WORLD"; console.log(str.toLowerCase());//"hello world" console.log(str.toUpperCase());//"HELLO WORLD"
6, replace()—替换部分字符
var str = "hello world,hello world,hello world"; console.log(str.replace("world","bokeyuan"));//"hello bokeyuan,hello world,hello world" console.log(str.replace(/world/g,"bokeyuan"));//"hello bokeyuan,hello bokeyuan,hello bokeyuan"
replace()接受两个参数:第一个参数可以是字符串或正则表达式,表示被查找的子串。第二个参数可以是字符串或函数(有返回值),表示替换文本。函数接受3个参数,第一个是需要被替换的字符串,第二个是在字符串中出现的位子,第三个是被查找的字符串本身(str)。
7, split()--分割字符串
var str = "hello world"; console.log(str.split("l"));//["he", "", "o wor", "d"]
接受一个参数,把字符串中出现的该参数作为分界点,分割字符串,返回一个数组。
8, fromCharCode() –-将字符编码转换成字符
1 var str = String.fromCharCode(65,66,67); 2 console.log(str);//"ABC"
fromCharCode()是String的一个静态方法,所以它的调用和其他方法有点不一样。它接受一个或多个数字,把他们当做字符编码,并转换成相应的字符。
在JavaScript中存在这样两种原始类型:Null与Undefined。这两种类型常常会使JavaScript的开发人员产生疑惑,在什么时候是Null,什么时候又是Undefined?Undefined类型只有一个值,即undefined。当声明的变量还未被初始化时,变量的默认值为undefined。
主要介绍了JS中检测数据类型的几种方式,typeof运算符用于判断对象的类型,但是对于一些创建的对象,它们都会返回\'object\',有时我们需要判断该实例是否为某个对象的实例,那么这个时候需要用到instanceof运算符
对于object和number、string、boolean之间的转换关系,ToPrimitive是指转换为js内部的原始值,如果是非原始值则转为原始值,调用valueOf()和toString()来实现。
Undefined类型表示未定义,它的类型只有一个值为undefined。undefined和null有一定的表意差别。非整数的Number类型无法使用 == 或 === 来比较,因为 JS 是弱类型语言,所以类型转换发生非常频繁
近在做项目代码重构,其中有一个要求是为代码添加智能提示和类型检查。智能提示,英文为 IntelliSense,能为开发者提供代码智能补全、悬浮提示、跳转定义等功能,帮助其正确并且快速完成编码。
基本类型:按值访问,可以操作保存在变量中实际的值;引用类型数据存在堆内存,而引用存在栈区,也就是说引用类型同时保存在栈区和堆区,关于==的执行机制,ECMASript有规范,因为==前后的值交换顺序,返回的值也是一样的,所以在此对规范做出如下总结
JavaScript 是一种弱类型或者说动态类型语言。所以你不用提前声明变量的类型,在程序运行时,类型会被自动确定,你也可以使用同一个变量保存不同类型的数据。
js的值传递和引用(地址)传递:js的5种基本数据类型 number,string,null,undefined,boolean 在赋值传递时是值传递,js的引用数据类型(object,array,function)进行引用传递,其实底层都是对象。
JS中所有的值都可以转换成布尔类型 使用Boolean()或者 !!(两个感叹号),JS中所有的值都可以转换成数字类型,使用Number()或+。数字类型转换场景目的只有一个,用于计算,将后台传递的数据,从字符串转换为数字并参与计算
众所周知,JS在很多情况下会进行强制类型转换,其中,最常见两种是:1.使用非严格相等进行比较,对==左边的值进行类型转换2.在if判断时,括号内的值进行类型转换,转化为布尔值
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!