深究js(二)——类型

2024-03-15 16:48
文章标签 类型 js 深究

本文主要是介绍深究js(二)——类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    简单来说,能够表示并操作的值的类型称做数据类型。在js中,有两种数据类型,一种是原始类型,另一种是对象类型(又称引用类型)。

    原始类型包括有数字(Number)、字符串(String)、布尔值(Boolean)、Underfine和Null,在js中,除了上述的这几个外就是对象,对象是属性的集合,每个属性都由名值对构成。普通的js对象是“命名值”的无序集合,js中另一个特殊的对象——数组是带编号的有序集合。除此以外,还有一个特殊的对象就是函数,所以综上所述,对象类型有对象(Obejct)、数组(Array)和函数(Function)。对象、数组和函数会在以后讲到,现在主要讲的是类型。下面详细讲上面的细节。

    一、数字(Number)

    与其他编程语言不同,在JavaScript中是不区分整数值和浮点数值的。JavaScript中的所有数字均用浮点数值来表示。JavaScript采用的是IEEE754标准定义的64位浮点格式来表示数字,所以它能表示的最大值是正负1.7976931348623157e+308,最小值是正负5e-324。在JavaScript中,整数的范围是正负2的53次方,如果使用了超过这个数位的整数则无法保证低位数字的精度。在JavaScript中如数组索引和位操作符是基于32位整数的。

    JavaScript的整数直接量有十进制的、十六进制的和八进制的。十六进制以0X为前缀,八进制以0为前缀,需要注意的是,在es6的严格模式中是不能用八进制的。JavaScript的浮点型除了可以采用传统写法(如1.2),也可以用科学计数法,也可以当数小于1的时候省略整数部分的0(如.3等于0.3)。

    在Number中除了上述的这几种外,还有另外的特殊五种,一个是正极值(Number.MAX_VALUE)、负极值(Number.MIN_VALUE)、超过极值后的正无穷(Number.POSITIVE_INFINITY,值为Infinity)、负无穷(Number.NEGATIVE_INFINITY,值为-Infinity)以及不是数字的(NaN)。NAN是一个假值,是由于不是数字的String类型转换为Number类型后发生的错误而导致的。NaN他自身不相等,如果用alert(NaN==NaN)来输出的话,发现输出结果是false。判断一个值是否为NaN应该用isNaN()函数。

    在数字类型中经常会遇见的一个问题是,假设变量x=0.3-0.2,变量y=0.2-0.1,那x和y是否会相等呢?答案是不会的。因为实数有无限个,但是JavaScript通过浮点数的形式只能表示其中有限的个数,也就是说,在JavaScript中,浮点数常常是真实值的一个近似表现。

    在JavaScript中,支持复杂的算术运算,这些复杂的运算通过作为Math对象的属性定义的函数和常量来实现的。常用的几个如下所示:

Math.pow(2,3)      //23次方
Math.round(0.6)    //四舍五入
Math.ceil(0.6)     //向上求整
Math.floor(0.6)    //向下求整
Math.abs(0.6)      //绝对值
Math.max(a,b,c)    //最大值可填入多个参数
Math.min(a,b,c)    //最小值,同上
Math.random()      //生成一个01.0的随机数
Math.PI            //圆周率

    二、字符串(String)

    在JavaScript中,字符串是一组由16位值组成的不可变的有序序列,每个字符通常来自于Unicode字符集。在这里解释一下16位值,因为JavaScript是采用UTF-16编码的Unicode字符集,字符串本身是一个字符数组,所以数组里每个元素都是占16bit的空间,也就是说是每个字符占用了两字节。在字符串中,可以用length方法来查看字符串的长度,字符串的索引是从0开始的。

    在字符串的直接量中,可以用单引号和双引号,在js中,这两个是没什么区别的,但是在ECMAScript标准中,这就有区别了,在ECMAScript标准中,字符串的直接量只能用单引号或者反引号,像var a = "aaa"这样的声明在ECMAScript标准中是会报错的,应该是var a = 'aaa'或者var a = `aaa`,在ECMAScript标准中,单引号是用于静态的直接量而反引号是用于动态的直接量。常用的几个转义字符如下所示:


    在JavaScript中,字符串的连接有两种方式,一种是用加号来连接,如:

var a = 'aa' + 'bb'

    另一种是用join()方法。join()方法是把数组里所有元素输出成一个字符串,方法里面可以填入参数,该参数为分隔符。如:

var a = ['a', 'b', 'c']
var b = a.join()           //输出a,b,c
var c = a.join('.')        //输出a.b.c
    如果不想输出有逗号则应该这样写:

var d = a.join('')
    下面列举字符串中常用的几个方法和属性:

var a = 'hello,world'
console.log(a.charAt(0))              //获取第一个字符
console.log(a.substring(1,4))         //获取第二到第四个字符
console.log(a.slice(1,4))             //同上
console.log(a.indexOf('l'))           //字符l首次出现的位置下标
console.log(a.lastIndexOf('l'))       //字符l最后一次出现的位置下标
console.log(a.indexOf('l',3))         //字符l在下标3及之后出现的下标
console.log(a.split(','))             //为分隔符,分割成两个子串
console.log(a.replace('h','H'))       //‘h’替换成‘H’
console.log(a.toUpperCase())          //所有字符大写
console.log(a.toLowerCase())          //所有字符小写
console.log(a.toLocaleLowerCase())    //同上
console.log(a.toLocaleUpperCase())    //所有字符大写
console.log(a.length)                 //获取字符串长度
    其中拿substring和slice、toUpperCase和toLocaleLowerCase以及toLowerCase和toLocaleLowerCase作详细的说明。

    substring和slice的方法类似,但是在某些地方上只能用slice而不能用substring,如里面的参数是负数的时候,slice是查找倒数第几个,而substring则从0开始查找。

    oUpperCase和toLocaleLowerCase以及toLowerCase和toLocaleLowerCase他们之间的用法没什么区别,但是在某些情况下只能用toLocaleLowerCase和

toLocaleLowerCase,比如(土耳其语)某些国家的文字则必须用这个方法才能转换大小写。


    三、布尔值(Boolean)

    这个类型只有两个值,就是true和false。常见的false值有:underfined、null、0、-0、NaN、“”(空字符串),所有的其他值,包括所有对象(数组)都会转换成true值。


    四、null和underfined

    尽管用alert(null == underfined)会输出一个true,但是实际上这两个是有很大的区别的,用alert(null === underfined)会输出false。首先先说一下这两个东西的共同点。他们如果是在布尔类型的地方都是假值,他们都不包含任何属性和方法,他们都表示空值。但是他们的不同是,首先null是一个对象,用typeof输出的是object,而underfined是全局对象里面的一个属性,一般认为underfined是由null里派生出来的。第二个不同是,null表示本来就没有的一个东西,而underfined只是表示一个变量没有赋值,变量没有赋值的原始值是underfined。还有就是当进行数字的类型转换,null会转换成0,而underfined则转换成NaN。


    五、全局对象(global)

    全局对象在JavaScript程序中可以直接使用,当JavaScript解释器启动时(或者任何Web浏览器加载新页面的时候),它将创建一个新的全局对象,并赋予一组定义的初始属性:

    1.全局属性,如underfined、Infinity和NaN

    2.全局函数,如isNaN()、parseInt()、eval()

    3.构造函数,如Date()、RegExp()、String()、Object()、Array()

    4.全局对象,如Math和JSON

    在客户端的JavaScript中,Window对象定义了一些额外的全局属性。注意,在这里global对象与window对象还是有区别的,global对象是比window对象更上一级,也就是说,window对象其实是从global对象里派生出来的,global对象浏览器里不能直接输出来。global对象是最顶级的。一般的this引用的是global对象,但是在客户端中,也可以理解为this引用的是window对象。

    在全局对象中有String()、Number()、Boolean()等构造函数,我们知道除了null和underfined没有属性和方法,其他的类型都有属性和方法,我们可以通过这些构造函数来将string、number和boolean这些不是对象的类型显式的转换成对象,通过他们对应的构造函数,如:

var a = new String('aaa')
alert(typeof a)
var b = 'aaa'
alert(typeof b)
alert(a == b)
    第一个输出的是对象第二个输出的是字符串,虽然两者之间比较是相等的,但是用三个等于号比较的时候返回的是false值。


    六、原始类型和对象类型的区别

    在JavaScript中,原始类型和对象类型的根本区别是原始类型是不可变的,而对象类型是可变的。也就是说,string、number、boolean、underfined和null的值是不可变的。比如:

var s = 'hello'
s.toUpperCase()
    这个方法表面上看来是改变了s的值,但是实际上输出的是另一个字符串值,原来的s的值并没有发生改变。而在对象和数组里,则可以轻松的改变他的值,如:

var a = {x:1}
a.x = 2
    a里面的x属性的值被改变了。值得一提的是,即使两个对象包含同样的属性及相同的值,他们也是不相等的。如:

var a = {x:1}
var b = {x:1}
alert(a === b)
    返回的是false值,若想要他们相等,则:

var a = {}
var b = a
b.x = 1
alert(a === b)
    从上可以了解到,将对象赋值给一个变量,仅仅是赋值的引用值:对象本身并没有复制一次。如果想得到一个对象或数组的副本,则必须显示的复制对象的每个属性或者数组的每个元素,如:

var deepCopy = function(source) {var result={};
    for (var key in source) {result[key] = typeof source[key]==='object'? deepCoyp(source[key]): source[key];
    }return result;
}
var a = {x:1, y:2, z:3}

    七、类型转换

    首先请看表:


    在实际的开发中,数值型想要转换为字符串型的话可以通过如下方法:

var a = 1 + ''
    或者通过显式的方法,如:

var a = 1
a = String(a)
    或者用这种方法:

var a = 1
var b = a.toString()
alert(typeof b)
    都可以将一个数值型转换成字符串型。在JavaScript中,可以通过Number()、String()、Boolean()和Object()来显式的转换类型。值得一提的是,null和underfined是没有toString()方法,因为这两个东西本身就没有方法,而且如果将这两个东西转换成对象的话会抛出异常,用object()方法的话则不会,只是返回一个空对象。

    字符串型转换成数值型有两个方法,一个是parseInt()方法,返回的是整数,另一个是parseFloat()方法,返回的是浮点数,这两个方法都是全局函数,不属于任何类的方法。下面展示这两个方法的用法:

parseInt('3 abc')    //返回3
parseInt('3.14')     //返回3
parseInt('0xff')     //返回255
parseInt('.1')       //返回NaN,因为缺了个0
parseFloat('.1')     //返回0.1,在浮点数里可以这样写
parseInt('11', 2)    //返回3,后面的参数表示几进制




这篇关于深究js(二)——类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/812616

相关文章

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求,要求做一款播放器,发现能力上跟EasyPlayer.js基本一致,满足要求: 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏(单屏/全屏) 多分屏(2*2) 多分屏(3*3) 多分屏(4*4) 播放控制 播放(单个或全部) 暂停(暂停时展示最后一帧画面) 停止(单个或全部) 声音控制(开关/音量调节) 主辅码流切换 辅助功能 屏

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G