JavaScript(2) 类型、值和变量

怼烎@ 2023-07-18 11:21 53阅读 0赞

JavaScript的数据类型分为两类:

1.原始类型(primitive type)和对象类型(object type)

原始类型里面包括:

1.字符串 2.数值 3.布尔值 4.null 5.undefined

  1. 对象(object)是property的集合,每个属性都由'名/键值对'。其中一个比较特殊的对象是全剧对象--global object.
  2. 普通的javascript对象是“命名值的无序集合”,
  3. 1.数组是特殊的一种对象(带编号的有续集合)
  4. 2.函数是特殊的一种对象(函数是具有与它相关联的可执行代码的对象)

如果函数用来初始化,使用new运算符一个新建对象。我们称之为构造函数

  1. 垃圾回收机制:
  2. Javascript有自己的内存管理机制,可以自动对内存进行垃圾回收。当不再有任何引用指向一个对象,解释器就会知道这个对象没有用了,然后会自动回收它所占的内存资源。

1字符串:

JavaScript的子串富川必须用引号括起来,此处的引号既可以是单引号,也可以是双引号。

var a = “123456789”;
var a = ‘123456789’;
注意:JavaScript和Java中的字符串主要有两点区别:

(1)JavaScript中的字符串可以用单引号括起来;

(2)JavaScript中比较两个字符串的字符序列是否相等使用 == 即可,无需使用equals()方法。

JavaScript以String内建类表示字符串,String类里包含了一系列方法操作字符串,String类有如下基本方法和属性操作字符串:

(1)charCodeAt() :返回字符串中特定索引处的字符所对应的Unicode值

(2)Legth():返回字符串的长度

(3)toUpperCase() : 将stringObj中的小写字母全部转成大写字母

(4)toLowerCase() :将stringObj中的大写字母全部转成小写字母

(5)fromCharCode() :直接通过String类调用方法,将一系列Unicode值转换成字符串

(6)indexOf() :返回字符串第一次出现的位置

(7)lastIndexOf() :返回字符串最后一次出现的位置

(8)subString() :截取stringObj从start开始,至end为止之前的所有字符,即包括start处的字符,但不包含end处的字符

(9)slice() :截取stringObj从start开始,到end为止之前的所有字符;即包括start处的字符,但不包括end处的字符。start与end均可为负值,当为负值时,表示从最后一个字符算起的第n个字符,比如-1表示最后一个字符,-2表示倒数第二个字符。

(10)match() :在字符串内检索指定的正则表达式的匹配结果,该结果与regexp是否有指定全局标志g有关

(11)split() :将separtor为为分隔,将stringObj分割成一个字符串数组。separator可以是字符串或者正则表达式,若为字符串,则以separator为分割符;弱separator为正则表达式,则以符合separator指定模式的字符串作为分隔符。

(12)replace() :将字符串中某个子串以特定字符串替代。

下面是一些常用的转义字符
**序
转义字符
使用说明
0

NUL 字符(\u0000)
1
\b
后退一格(Backspace)退格符(\u0008)
2
\f
换页(Form Feed)(\u000C)
3
\n
换行(New Line)(\u000A)
4
\r
回车(Carriage Return)(\u000D)
5
\t
制表(Tab)水平制表符(\u0009)
6
\‘
单引号(\u0027)
7
\“
双引号(\u0022)
8
\\
反斜线(Backslash)(\u005C)
9
\v
垂直制表符(\u000B)
10
\xNN
由两位十六进制数值NN指定的Latin-1字符
11
\uNNNNN
由四位十六进制数NNNN指定的Unicode字符
12
\NNN
由一位到三位八进制数(1到377)指定的Latin-1字符。
ECMAScript v3不支持,不要使用这种转义序列**

2数值:

在javascript里面是不区分整数值和浮点值的,采用的是IEEE745标准定义的64位浮点格式表示数字。

最常见的问题就是0.3-0.2结果是不等于0.1的0.3-0.2 = 0.099 999 999 999 999 98。(电商平台里面的金额可以使用分为单位,可以有效的避免浮点数的计算)

在开发中,为了解决这种问题,也可以使用

类库

通常这种对精度要求高的计算都应该交给后端去计算和存储,因为后端有成熟的库来解决这种计算问题。前端也有几个不错的类库:

Math.js

Math.js 是专门为 JavaScript 和 Node.js 提供的一个广泛的数学库。它具有灵活的表达式解析器,支持符号计算,配有大量内置函数和常量,并提供集成解决方案来处理不同的数据类型
像数字,大数字(超出安全数的数字),复数,分数,单位和矩阵。 功能强大,易于使用。

官网:http://mathjs.org/

GitHub:https://github.com/josdejong/mathjs

decimal.js

为 JavaScript 提供十进制类型的任意精度数值。

官网:http://mikemcl.github.io/decimal.js/

GitHub:https://github.com/MikeMcl/decimal.js

big.js

官网:http://mikemcl.github.io/big.js

GitHub:https://github.com/MikeMcl/big.js/

这几个类库帮我们解决很多这类问题,不过通常我们前端做这类运算通常只用于表现层,应用并不是很多。所以很多时候,一个函数能解决的问题不需要引用一个类库来解决。

下面介绍各个更加简单的解决方案。

整数表示

对于整数,我们可以通过用String类型的表示来取值或传值,否则会丧失精度。

格式化数字、金额、保留几位小数等

如果只是格式化数字、金额、保留几位小数等可以查看这里 https://www.html.cn/archives/7324

浮点数运算

toFixed() 方法

浮点数运算的解决方案有很多,这里给出一种目前常用的解决方案, 在判断浮点数运算结果前对计算结果进行精度缩小,因为在精度缩小的过程总会自动四舍五入。

toFixed() 方法使用定点表示法来格式化一个数,会对结果进行四舍五入。语法为:

JavaScript 代码:

  1. numObj.toFixed(digits)

参数 digits 表示小数点后数字的个数;介于 0 到 20 (包括)之间,实现环境可能支持更大范围。如果忽略该参数,则默认为 0。

返回一个数值的字符串表现形式,不使用指数记数法,而是在小数点后有 digits 位数字。该数值在必要时进行四舍五入,另外在必要时会用 0 来填充小数部分,以便小数部分有指定的位数。 如果数值大于 1e+21,该方法会简单调用 Number.prototype.toString()并返回一个指数记数法格式的字符串。

3.布尔值

Boolean对象是一个布尔值的对象包装器。

语法:

  1. new Boolean([value]);
  2. // 参数
  3. value // 可选,用来初始化Boolean对象

如果第一个参数不是布尔值,则会将其转换为布尔值。

  • 如果省略该参数,或者其值为0/-1/null/false/NaN/undefined/''则生成Boolean对象的值为false。
  • 如果传入的参数是DOM对象document.all,也会生成值为false的Boolean对象。
  • 如果传入其他的值,包括值为’false’的字符串和任何对象,都会创建一个值为true的Boolean对象。

当Boolean对象用于条件语句的时候,任何不是undefined和null的对象,包括值为false的Boolean对象,都会被当做true来对待。

示例:下面的if语句条件为真:

  1. let x = new Boolean(false);
  2. if(x) {
  3. // 这里的代码会被执行
  4. }

不要使用创建Boolean对象的方式将一个非布尔值转化为布尔值,直接将Boolean当做转换函数来使用即可

  1. let x = Boolean(expression); // 推荐,x是一个基本数据类型
  2. let x = Boolean(expression); // 不推荐,x是一个Boolean对象

注:不要在应该使用基本类型布尔值的地方使用Boolean对象。

========== 属性 ==========

Boolean.length length属性,值为1。

Boolean.prototype构造函数的原型对象。

========== 方法 ==========

Boolean对象自身没有任何方法,不过它从自己的原型链上继承了一些方法。

========== 实例属性 ==========

Boolean.prototype.constructor 返回创建了实例原型的函数。默认为Boolean函数

========== 实例方法 ==========

1.Boolean.prototype.toString()返回指定的布尔对象的字符串形式。

语法:

  1. bool.toString();
  2. // 返回值:表示特定Boolean对象的字符串

Boolean对象覆盖了Object对象的toString方法。并没有继承Object.prototype.toString()。对于布尔对象,toString方法返回该对象的字符串形式。

当一个Boolean对象作为文本值或进行字符串连接时,JavaScript会自动调用其toString方法。

  1. let flag = new Boolean(true);
  2. let myVar = flag.toString();
  3. console.log(myVar); // true
  4. console.log(flag+' hah'); // true hah
  5. console.log(true + ' hah'); // true hah

2.Boolean.prototype.valueOf()返回一个Boolean对象的原始值。

Boolean的valueOf方法返回一个Boolean对象或Boolean字面量的原始值作为布尔数据类型。

  1. let x = new Boolean();
  2. let flag = x.valueOf();
  3. if(x) {
  4. console.log('I am x');
  5. }
  6. if(flag) {
  7. console.log('I am flag');
  8. }
  9. // 上面代码在控制台只输出:I am x

Null:

null是js中的关键字,表示空值,null可以看作是object的一个特殊的值,如果一个object值为空,表示这个对象不是有效对象。

Undefined:

undefined不是js中的关键字,其是一个全局变量,是Global的一个属性,以下情况会返回undefined:

1)使用了一个未定义的变量;var i;

2)使用了已定义但未声明的变量;

3)使用了一个对象属性,但该属性不存在或者未赋值;

4)调用函数时,该提供的参数没有提供:








1

2

3

4

function func(a){

   console.log(a);      

}

func();//undefined

5)函数没有返回值时,默认返回undefined








1

2

var aa=func();

aa;//undefined

相同点:

都是原始类型的值,保存在栈中变量本地

两者的区别:

1.类型不一样:








1

2

3

console.log(typeOf undefined);//undefined

 

console.log(typeOf null);//object

2.转化为值时不一样:undefined为NaN ,null为0








1

2

3

4

5

console.log(Number(undefined));//NaN

console.log(Number(10+undefined));//NaN

 

console.log(Number(null));//0

console.log(Number(10+null));//10

3.undefined===null;//false

  1. undefined==null;//true

何时使用:

null当使用完一个比较大的对象时,需要对其进行释放内存时,设置为null;








1

2

var arr=[“aa”,“bb”,“cc”];

arr=null;//释放指向数组的引用

发表评论

表情:
评论列表 (有 0 条评论,53人围观)

还没有评论,来说两句吧...

相关阅读