JS中的类型与值

1、类型

我们这样来定义类型:类型是值的内部特征,它定义了值的行为,以使其区别于其他值

1.1、内置类型

JS有其中内置类型:null、undefined、boolean、number、string、object、symbol(ES6新增),除了对象之外,其余统称为“基本类型”

可以使用typeof运算符来查看值的类型,但是null是一个例外

typeof null === "object" // true

在函数对象中,length属性是其声明的参数的个数,数组也是对象,是object的一个“子类型”

function a(b,c){...
}
a.length // 2

1.2、值和类型

JS中的变量是没有类型的,只有值才有。变量可以随时持有任何类型的值

typeof运算符总是会返回一个字符串

已在作用域中声明但还没有赋值的变量,是undefined。相反,还没有在作用域中声明过的变量,是undeclared的

var a ;
a // undefined
b // ReferenceError: b is not defined

对于这类情况的处理让人抓狂,如果对于b可以返回undeclared的话,情况会好很多

1.3、总结

JS有 七 种 内 置 类 型:null、undefined、boolean、number、string、object 和symbol,可以使用 typeof 运算符来查看。

变量没有类型,但它们持有的值有类型。类型定义了值的行为特征。

很 多 开 发 人 员 将 undefined 和 undeclared 混 为 一 谈, 但 在JS中 它 们 是 两 码 事。undefined 是值的一种。undeclared 则表示变量还没有被声明过。遗憾的是,JavaScript 却将它们混为一谈,在我们试图访问 “undeclared” 变量时这样报错:ReferenceError: a is not defined, 并 且 typeof 对 undefined 和 undeclared 变 量 都 返 回"undefined"。

然而,通过 typeof 的安全防范机制(阻止报错)来检查 undeclared 变量,有时是个不错的办法。

2、值

2.1、数组

在JS中,数组可以容纳任何类型的值,可以是字符串、数组、对象,甚至是其他数组

使用delete运算符可以将单元从数组中删除,但是删除后,数组的length属性并不会发生变化

var a = [ ];
a[0] = 1;
a["foobar"] = 2;
a.length; // 1
a["foobar"]; // 2
a.foobar; // 2

数组通过数字进行索引,但是有趣的是他们也是对象,所以他们也可以包含字符串键值和属性

2.2、类数组

可以使用数组工具函数(indexOf(…)、concat(…)、forEach(…))将类数组转换位真正的数组,也可以使用Array.from()

const arrayLike = { 0: 'a', 1: 'b', 2: 'c', length: 3 };
const arr = Array.from(arrayLike);
console.log(arr); // ['a', 'b', 'c']const arrayLike = { 0: 'a', 1: 'b', 2: 'c', length: 3 };
const arr = Array.prototype.slice.call(arrayLike);
console.log(arr); // ['a', 'b', 'c']

2.3、字符串

字符串与数组类似,,他们都是类数组,都有length属性以及indexOf(…)和concat(…)方法,但是在JS中字符串是不可变的,而数组是可变的,在进行字符串反转时,我们可以如下来做:

var c = a.split("") // 将a的值转换为字符数组.reverse() // 将数组中的字符进行倒转.join("") // 将字符串中的字符拼接回字符串

2.4、数字

JS只有一种数值类型,包括“整数”和带小数的十进制数

JS中的数字类型是基于IEEE754标准来实现的,该标准通常也被称为“浮点数”,JS使用的是“双精度”格式(64位二进制)

特别大和特别小的数字默认用指数格式显示,与toExponential()函数(用于将数字转换为指数形式的字符串)的输出结果一致

const num = 123.456789;
console.log(num.toExponential()); // 输出:1.23456789e+2
console.log(num.toExponential(2)); // 输出:1.23e+2
console.log(num.toExponential(6)); // 输出:1.234568e+2

tofixed(…)方法可指定小数部分的显示位数

var a = 42.59;
a.toFixed( 0 ); // "43"
a.toFixed( 1 ); // "42.6"
a.toFixed( 2 ); // "42.59"
a.toFixed( 3 ); // "42.590"
a.toFixed( 4 ); // "42.5900"

toPrecision(…) 方法用来指定有效数位的显示位数

var a = 42.59;
a.toPrecision( 1 ); // "4e+1"
a.toPrecision( 2 ); // "43"
a.toPrecision( 3 ); // "42.6"
a.toPrecision( 4 ); // "42.59"
a.toPrecision( 5 ); // "42.590"
a.toPrecision( 6 ); // "42.5900"

上边的方法不仅适用于数字变量,也适用于数字字面量。不过对于.运算符需要给予特别注意,因为它是一个有效数字字符,会被优先识别为数字字面量的一部分,然后才是对象属性访问运算符

// 无效语法:
42.toFixed( 3 ); // SyntaxError
// 下面的语法都有效:
(42).toFixed( 3 ); // "42.000"
0.42.toFixed( 3 ); // "0.420"
42..toFixed( 3 ); // "42.000"

在JS中0.1+0.2!=0.3,因为他是浮点数,我们可以设置一个误差范围值,该值定义在Number.EPSILON中,可以使用它来比较两个数字是否相等

function numbersCloseEnoughToEqual(n1,n2) {return Math.abs( n1 - n2 ) < Number.EPSILON;
}
var a = 0.1 + 0.2;
var b = 0.3;
numbersCloseEnoughToEqual( a, b ); // true
numbersCloseEnoughToEqual( 0.0000001, 0.0000002 ); // false

如果要检测一个值是否为整数,可以使用ES6中的Number.isInteger(…)方法

Number.isInteger( 42 ); // true
Number.isInteger( 42.000 ); // true
Number.isInteger( 42.3 ); // false

2.5、特殊的值

null是一个特殊关键字,不是标识符,不能将其当做变量来使用,尽管 null 可以被赋值给变量,但它本身并不是变量,也不应该被当做变量来使用。当我们需要表示一个空的对象引用时,才将 null 赋值给变量,并使用该变量来表达空值的概念

undefined是一个标识符,可以被当做变量来使用和赋值

void运算符,void___ 没有返回值,因此返回结果是undefined,void并不改变表达式的结果,只是让表达式不返回值,如果要将代码中的值设为undefined,就可以使用void

var a = 42;
console.log( void a, a ); // undefined 42

2.6、特殊的数字

NaN意指“不是一个数字”,是一个特殊值,它和自身不相等,是唯一一个非自反的值,因此无法对其进行比较,那么应该如何判断它,可以使用isNaN,该方法意思是“参数是否不是NaN,也不是数字”

var a = 2 / "foo";
isNaN( a ); // true

我们也可以使用下边的方法

var a = 2 / 'foo';
var b = 'foo';
console.log(Number.isNaN(a)); // true
console.log(Number.isNaN(b)); // false

无穷数Infinity

在JS中var a = 1 / 0 的结果为Infinity,如果该式中一个数为负数,结果即为-Infinity

JS中,零值分为+0和-0,为什么我们需要-0,因为某些程序中的数据需要以级数形式来表示(比如动画帧的移动速度)

在ES6中,新加入了一个工具方法Object.is(…)来判断两个值是否相等,但是能使用“”和“=”的时候就尽量不要使Object.is(…),因为前者的效率更高也更为通用

2.7、值和引用

在许多语言中,复制和参数传递可以通过值复制或者引用复制来完成。引用就像一种特殊的指针,是来指向变量的指针,但是在JS中没有指针,引用的工作机制也不尽相同。在JS中变量不可能成为指向另一个变量的引用。JS引用指向的是值。如果一个值有10个引用,这些引用指向的都是同一个值,它们之间没有引用/指向关系。

简单值(基本类型值)总是通过值复制的方式来赋值/传递,包括null、undefined、字符串、数组、布尔和ES6中的symbol,复合值—对象和函数,则总是通过引用复制的方式来赋值/传递。

引用指向的是值本身而非变量,所以一个引用无法更改另一个引用的指向

function foo(x) {x.push( 4 );x; // [1,2,3,4]// 然后x = [4,5,6];x.push( 7 );x; // [4,5,6,7]
}
var a = [1,2,3];
foo( a );
a; // 是[1,2,3,4],不是[4,5,6,7]

我们不能通过引用 x 来更改引用 a 的指向,只能更改 a 和 x 共同指向的值。

如果要将a的值变为[4,5,6,7],必须更改x指向的数组,而不是为x赋值一个新数组

function foo(x) {x.push( 4 );x; // [1,2,3,4]// 然后x.length = 0; // 清空数组x.push( 4, 5, 6, 7 );x; // [4,5,6,7]
}
var a = [1,2,3];
foo( a );
a; // 是[4,5,6,7],不是[1,2,3,4]

我们无法自行决定使用值复制还是引用复制,一切由值的类型来决定。

3、总结

JS中的数组是通过数字索引的一组任意类型的值。字符串和数组类似,但是它们的行为特征不同,在将字符作为数组来处理时需要特别小心。JavaScript 中的数字包括“整数”和“浮点型”。

基本类型中定义了几个特殊的值。null 类型只有一个值 null,undefined 类型也只有一个值 undefined。所有变量在赋值之前默认值都是 undefined。void 运算符返回 undefined。

数 字 类 型 有 几 个 特 殊 值, 包 括 NaN( 意 指“not a number”, 更 确 切 地 说 是“invalidnumber”)、+Infinity、-Infinity 和 -0。

简单标量基本类型值(字符串和数字等)通过值复制来赋值 / 传递,而复合值(对象等)通过引用复制来赋值 / 传递。JavaScript 中的引用和其他语言中的引用 / 指针不同,它们不能指向别的变量 / 引用,只能指向值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/186625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智安网络|发现未知风险,探索渗透测试的奥秘与技巧

在当今信息时代&#xff0c;网络安全已成为组织和个人面临的重大挑战。为了保护网络系统的安全&#xff0c;渗透测试成为一种重要的手段。 一、渗透测试的基本原理 渗透测试是通过模拟黑客攻击的方式&#xff0c;对目标系统进行安全评估。其基本原理是模拟真实攻击者的思维和行…

openGauss学习笔记-136 openGauss 数据库运维-例行维护-检查数据库性能

文章目录 openGauss学习笔记-136 openGauss 数据库运维-例行维护-检查数据库性能136.1 检查办法136.2 异常处理 openGauss学习笔记-136 openGauss 数据库运维-例行维护-检查数据库性能 136.1 检查办法 通过openGauss提供的性能统计工具gs_checkperf可以对硬件性能进行检查。 …

一个软件测试练手项目——学生信息管理系统测试,卷起来啊

免费分享一个练手项目&#xff0c;学生信息管理系统&#xff0c;获取方式在文末 1.引言 1.1项目目的 软件测试是为了在软件投入生产性运行之前&#xff0c;尽可能多地发现软件的错误。该项目的目的是给学习软件测试的朋友练手用 1.2 项目背景 随着学校的规模不断扩大&…

【C 语言经典100例】C 练习实例18

题目&#xff1a;求saaaaaaaaaaaa…a的值&#xff0c;其中a是一个数字。例如222222222222222(此时共有5个数相加)&#xff0c;几个数相加有键盘控制。 程序分析&#xff1a;关键是计算出每一项的值。 #include<stdio.h> int main() {int s0,a,n,t;printf("请输入 a…

【JUC】十九、volatile与内存屏障

文章目录 1、volatile的两大特性2、volatile的四大内存屏障3、分类4、happens-before之volatile变量重排规则5、读写屏障插入策略 1、volatile的两大特性 被volatile修饰的变量有两大特点&#xff1a; 可见性有序性 关于volatile的可见性&#xff0c;也即volatile的内存语义…

Linux介绍

文章目录 前言一、概述 前言 Linux学习笔记。 一、概述 linux怎么读,不下10种 linux是一个开源、免费的操作系统&#xff0c;其稳定性、安全性、处理多并发已经得到业界的认可&#xff0c;目前很多企业级的项目(c/c/php/python/java/go)都会部署到Linux/unix系统上。 常见的…

mysql面试相关问题及答案

基础概念 1. **什么是数据库&#xff1f;什么是 MySQL&#xff1f;** - 数据库是一个组织和存储数据的集合&#xff0c;可进行有效的数据管理。 - MySQL是一个关系型数据库管理系统&#xff0c;以SQL为基础&#xff0c;广泛用于Web应用。 2. **MySQL与其他数据库有…

联软 IT 安全运维管理软件反序列化漏洞复现

0x01 产品简介 联软科技持续十多年研发的联软IT安全运维管理软件&#xff0c;集网络准入控制、终端安全管理、BYOD设备管理、杀毒管理、服务器安全管理、数据防泄密、反APT攻击等系统于一体&#xff0c;通过一个平台&#xff0c;统一框架&#xff0c;数据集中&#xff0c;实现更…

部署WAF安全应用防火墙(openresty部署)

使用NGINX+Openresty实现WAF功能 一、了解WAF 1.1 什么是WAF Web应用防护系统(也称:网站应用级入侵防御系统 。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用 防火墙 是通过执行一系列针对HTTP/HTTPS的 安全策略 来专门为Web应用提供保…

Android中在google Map 上绘制历史路径

很多的App都会有这种需求&#xff0c;需要把自己的轨迹绘制在地图上来加标一段行踪&#xff0c;使得自己的行程展现出来&#xff0c;通过地图的展示&#xff0c;自己的行程也就一目了然了。 这里利用Google Map 把自己的行程展现出来&#xff0c;注意这里用到了上一章的基础&a…

C语言——写一个简单函数,找两个数中最大者

#include <stdio.h>int max( int a, int b ) { return a>b ? a:b; }int main() { int a, b;printf("输入两个数:\n");scanf("%d %d", &a, &b);printf("max %d\n", max(a, b));return 0; }输出结果&#xff1a;

csdn最新最全面的Jmeter接口测试:jmeter_逻辑控制器_循环控制器

循环控制器 循环次数&#xff1a;设置该控制器下的请求的循环执行次数 永远&#xff1a;勾选上的话&#xff0c;会一直循环&#xff0c;即所谓死循环 注意&#xff1a;如果线程组本身已经设置了循环次数的话&#xff0c;那循环控制元件控制的子节点 的循环次数为线程组设置的…

Rust的Vec优化

本篇是对Rust编程语言17_Rust的Vec优化[1]学习与记录 MiniVec https://crates.io/crates/minivec enum DataWithVec { // tag,uint64,8字节 I32(i32), // 4字节,但需内存对齐到8字节? F64(f64), // 8字节 Bytes(Vec<u8>), // 24字节}fn main()…

浅聊代理(应用部署)

以前很少接触过项目的上线部署&#xff0c; 我对前后端交互的认知还停留在前端一个请求 对应后端一个API 比如后端提供: /api/backend/categories -GET 前端则通过使用ajax或者axios组件去构建http请求&#xff0c; 发送到: https://host:port/api/backend/categories -GET 一、…

springboot(ssm电力员工安全施工培训管理系统Java(codeLW)

springboot(ssm电力员工安全施工培训管理系统Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xf…

【ARM AMBA AXI 入门 18 - AXI4 NSAID 和 NS 详细介绍】

请阅读【ARM AMBA AXI 总线 文章专栏导读】 文章目录 NS 信号NS(Non-Secure)信号介绍NS信号的例子NSAIDNSAID 使用举例NS 信号 NS(Non-Secure)信号在 ARM AXI(Advanced eXtensible Interface)总线协议中是与 ARM TrustZone 安全技术相关联的信号。它用于指示 AXI 总线上…

安全高效的PostgreSQL数据库迁移解决方案

PostgreSQL数据库是一款高度可扩展的开源数据库系统&#xff0c;支持复杂的查询、事务完整性和多种数据类型&#xff0c;这使得它成为企业中处理大规模和多样化数据需求的理想选择。在很多企业中&#xff0c;PostgreSQL不仅处理大量的交易数据&#xff0c;还支持复杂的数据分析…

Django二转Day03 04

0 cbv执行流程&#xff0c;self问题 path(index/, Myview.as_view()),Myview.as_view() 实例化后返回 变成return Myview.dispatch(request, *args, **kwargs)但是视图函数Myview中没有 dispatch 方法 所以去 父类View中寻找return View.dispatch(request, *args, **kwargs)调用…

Selenium(12):层级定位_通过父元素找到子元素

层级定位 在实际的项目测试中&#xff0c;经常会遇到无法直接定位到需要选取的元素&#xff0c;但是其父元素比较容易定位&#xff0c;通过定位父元素再遍历其子元素选择需要的目标元素&#xff0c;或者需要定位某个元素下所有的子元素。 层级定位的思想是先定位父对象&#xf…

C现代方法(第24章)笔记——错误处理

文章目录 第24章 错误处理24.1 <assert.h>: 诊断24.2 <errno.h>: 错误24.2.1 perror函数和strerror函数 24.3 <signal.h>: 信号处理24.3.1 信号宏24.3.2 signal函数24.3.3 预定义的信号处理函数24.3.4 raise函数 24.4 <setjmp.h>: 非局部跳转问与答写在…