《你不知道的Javascript--中卷 学习总结》(类型、值)
类型
类型是值
的内部特征,它定义了值的行为
,以使其区别于其他值。
内置类型
1、七种内置类型:
- 空值(null)
- 未定义(undefined)
- 布尔值(boolean)
- 数字(number)
- 字符串(string)
- 对象(object)
- 符号(symbol,ES6中新增)
2、我们可以用typeof
运算符来查看值的类型,它返回的是类型的字符串值
。
3、因为typeof null === 'object',所以检测null值的类型需要下面这段复合条件
var a = null;(!a && typeof a == "object"); // true
复制代码
4、函数实际上是object的一个"子类型"
。具体的说,函数是"可调用对象",它有一个内部属性[[call]]
,该属性使其可以被调用。
5、函数对象的length属性
是其声明的参数的个数
值和类型
1、Javascript中的变量是没有类型的
,只有值
才有。变量可以随时持有任何类型的值。
2、已在作用域中声明
但还没有赋值
的变量,是undefined
。
3、还没有在作用域中声明过得变量
,是undeclared
。
var a;typeof a // "undefined"typeof b // "undefined" 没有声明还是undefined 这主要是因为typeof的安全防范机制
复制代码
typeof安全防范机制
- 全局变量的检验
// 这样是安全的if(typeof DEBUG ! == "undefined"){console.log('xxxxx')}
复制代码
- 非全局变量是否定义
(function(){function FeatureXYZ(){};function doSomethingCool(){var helper = (typeof FeatureXYZ !== "undefined") ? FeatureXYZ :function(){// default feature}var a = helper();}doSomethingCool()})()
复制代码
- 函数传递参数检测
function doSomethingCool(FeatureXYZ){var helper = FeatureXYZ || function(){}var val = helper();// ...}
复制代码
值
数组
1、数组可以容纳任何类型的值,可以是字符串
、数字
、对象
,甚至是其他数组
。
2、使用delete运算符可以将单元从数组中删除,但是请注意,单元删除后,数组的length属性并不会发生变化
。
3、在创建"稀疏"数组(即含有空白或空缺单元的数组)。a[1]的值为undefined,但这与将其显示赋值为undefined(a[1] = undefined)还是有所区别。
var a = [];a[0] = 1;a[2] = [3];a[1] // undefineda.length // 3
复制代码
4、数组通过数字进行索引
,但是他们也是对象,所以也可以包含字符串键值
和属性
(但这些并不计算在数组长度内
)。
5、如果字符串键值能够被强制类型转换为十进制数字的话
,它就会被当做数字索引来处理
var a = [];a[0] = 1;a['foo'] = 2;a.length // 1a['foobar'] //2a.foobar //2var a = [];a['13'] = 42;a.length // 14
复制代码
6、类数组=>数组的方式
- slice
function foo(){var arr = Array.prototype.slice.call(arguments);arr.push('bam');console.log(arr)}foo('bar','baz') // ['bar','baz','bam']
复制代码
- Array.from() (ES6)
var arr = Array.from(arguments)
复制代码
字符串
1、Javascript中字符串是不可变的(指字符串的成员函数不会改变其原始值
,而是创建并返回一个新的字符串
),而数组是可变的。
2、字符串没有reverse方法,变通方法可以先转换为数组然后转换为字符串。
var a = 'foo'var c = a.split("").reverse().join("")c; //"oof"
复制代码
数字
1、Javascript中的数字类型是基于IEEE754标准
来实现的,该标准通常也被称为"浮点数"。Javascript使用的是"双精度"格式。
2、toFixed() 方法可以指定小数部分的显示位数
,如果指定的小数部分的显示位数多于实际位数就用0补齐。
3、toPrecision() 方法用来指定有效数位
的显示位数。
4、.运算符需要给与特别的注意,因为它是一个有效的数字字符
,会被优先识别为数字字面量的一部分
,然后才是对象属性访问运算符
。
// 无效语法42.toFixed(3) // SyntaxError// 下面的语法都有效(42).toFixed(3) // 42.0000.42.toFixed(3) // 0.42042..toFixed(3) // 42.000
复制代码
5、二进制浮点数最大的问题(所有遵循IEEE754规范的语言都是如此)就是小数的精度不准。(例如0.1+0.2===0.3 等于false的经典问题)
// 判断两个小数相等function numberCloseEnoughToEqual(n1,n2){return Math.abs(n1-n2) < Number.EPSILON;}var a = 0.1 + 0.2;var b = 0.3;numberCloseEnoughToEqual(a,b) // true
复制代码
6、可以使用Number.isInteger()来检测一个值是否是整数。
Number.isInteger(42) // trueNumber.isInteger(42.000) // trueNumber.isInteger(42.3) // false// polyfillif(!Number.isInteger){Number.isInteger = function(num){return typeof num === 'number' && num % 1 == 0}}
复制代码
7、a | 0 可以将变量a中的数值转换为32位有符号整数,因为数位运算符|只适用于32位整数(它只关心32位以内的值,其他的数位将被忽略)。
8、undefined类型只有一个值,即undefined
。null类型也只有一个值,即null
。他们的名称既是类型也是值。undefined指从未赋值
,null只曾赋过值,但是目前没有值
9、null是一个特殊关键字
,不是标识符
,我们不能将其当做变量来使用和赋值。然而undefined却是一个标识符
,可以被当作变量来使用和赋值。
10、在非严格模式下,我们可以为全局标识符undefined赋值
function foo(){undefined = 2; // 非常糟糕的做法}foo();function foo(){"use strict";undefined = 2; // TypeError}foo()
复制代码
11、我们可以通过void运算符
即可得到undefined。表达式void __ 没有返回值,因此返回结果是undefined。void并不改变表达式的结果
,只是让表达式不返回值
。通常我们用void 0 来获得undefined。
var a = 42;console.log(void a,a) // undefined 42
复制代码
12、不是数字的数字(NaN)
- NaN是
数字
类型的
var a = 2 / "foo"; // NaNtypeof a === 'number' // true
复制代码
- 检测NaN
// 全局函数isNaN判断。(但是有一个缺陷,就是当传递一个非数字的时候,isNaN也返回true)var a = 2 / 'foo';var b = 'foo';window.isNaN(a) // true window.isNaN(b) // true // ES6 的Number.isNaNif(!Number.isNaN){Number.isNaN = function(n){return (typeof n === "number" && window.isNaN(n))}}// 最简单的方法,NaN是Javascript中唯一一个不等于自身的值if(!Number.isNaN){Number.isNaN = function(){return n !== n;}}
复制代码
13、零值
- Javascript中有一个常规的0和一个-0
- 对
负零
进行字符串化
会返回'0'
var a = 0 / -3;a; // -0a.toString() // '0'a+'' // '0'String(a) // '0'
复制代码
- 将
字符串
转换为数字
,得到的结果是准确的。
+"-0" // -0Number("-0") // -0JSON.parse("-0") // -0
复制代码
- 判断-0
function isNegZero(n){n = Number(n);return (n===0) && (1/n===-Infinity)}
复制代码
14、ES6新加入了一个工具方法Object.is()
来判断两个值是否绝对相等(加入了NaN和-0的判断)
if(!Object.is){Object.is = function(v1,v2) {// 判断是否为-0if(v1===0 && v2===0){return 1/v1 === 1/v2}//判断是否为NaNif(v1!==v1){return v2!==v2;}// 其他情况return v1 === v2;}}
复制代码
《你不知道的Javascript--中卷 学习总结》(类型、值)相关推荐
- php中常见的错误类型有,JavaScript中常见的错误类型有哪些?(详细介绍)
在JavaScript中,当发生错误时会生成描述错误类型的错误对象,此错误对象包含错误类型和编号等信息,这些信息可用于后续处理等,在本篇文章中将给大家介绍常见的错误类型以及如何处理这些错误. Java ...
- JavaScript中的六种错误类型
刚入前端坑,英语又不太好的同学,是不是还在为控制台的错误抓耳挠腮?今天就带大家看一看JavaScript中常见的错误类型. js中的控制台的报错信息主要分为两大类,第一类是语法错误,这一类错误在预解析 ...
- C#保留2位小数几种场景总结 游标遍历所有数据库循环执行修改数据库的sql命令 原生js轮盘抽奖实例分析(幸运大转盘抽奖) javascript中的typeof和类型判断...
C#保留2位小数几种场景总结 场景1: C#保留2位小数,.ToString("f2")确实可以,但是如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.25. ...
- html获取contextpath,JavaScript中${pageContext.request.contextPath}取值问题及解决方案
在JSP里取${pageContext.request.contextPath},方式一是可以正常取到,但方式二却取到的是 字符"${pageContext.request.contextP ...
- 你不知道的JavaScript系列(一)—— 类型
为什么80%的码农都做不了架构师?>>> JavaScript中有七种内置类型: 1.空值(null) 2.undefined 3.布尔值(boolean) 4.数字(number) ...
- 《你不知道的JavaScript》整理(五)——值与原生函数
一.值 1)数字 JavaScript只有一种数值类型:number(数字),包括"整数"和带小数的十进制数. //数字的语法 var a = 5E10; // 500000000 ...
- JavaScript 中对象的属性类型
对象的属性类型 JavaScript 中的对象的属性包括数据属性和访问器属性,在 JavaScript 引擎的内部实现中定义了用于描述属性(property)的特性(attribute).规范中将特性 ...
- 浅谈JavaScript中的对象和类型(上)
JavaScript是一种不同于任何强类型程序设计语言的脚本语言,这决定了它对于许多强类型语言的程序员来说有很多莫名其妙.难以理解的地方,本文是本人对JavaScript的一些实践总结出来的简单易懂的 ...
- JavaScript中的逻辑运算的返回值(逻辑与,逻辑或||,逻辑非!)
原文链接:https://blog.csdn.net/kevinhjing/article/details/48206787 在JavaScript中,逻辑与非或经常用在条件判断语句中: if( a ...
- JavaScript 中检查数组是否包含值的 5 种方法
在 JavaScript 中,有多种方法可以检查数组是否包含项目.您始终可以使用for 循环或Array.indexOf()方法,但 ES6 添加了许多更有用的方法来搜索数组并轻松找到您要查找的内容. ...
最新文章
- oracle11g与weblogic兼容,WebLogic 10.3.6与JDK 1.7的兼容问题
- ADF Jar包循环引用会出问题
- 计算器初步添加消息响应
- 如何在dw上编写php_用dw制作php网站视频教程
- 解决GitHub中头像显示异常、设置不了头像、README图片无法显示等问题
- Restorator V2009 单文件版
- Flutter:尝试撸一个具有惯性跟阻力的旋转控件或用传感器控制其旋转
- 解决新版本webpack vue-cli生成文件没有dev.server.js问题
- 什么样的领导最难搞定?
- mysql在故障切换时的事件调度器注意事项
- rs485接口上下拉_通讯接口应用笔记1:RS485通讯上下拉电阻的选择
- python图像风格迁移_Python 超简单实现9种图像风格迁移
- JAVA中无法加载主类什么意思_找不到或无法加载主类什么意思?
- android分析声音中的节奏,[AndroidTips]调用TextToSpeech朗读的时候怎么中间停顿
- 2021的第一篇文章,开个好头先
- c语言arg是什么函数,arg函数(arg辐角公式)
- VUE3+Vite开发网易云音乐 Day1 后端环境搭建
- QGIS进行坐标转换
- 摄像头网络直播方案LiveGBS部署问题 使GB28181实现无插件web直播
- 手机Flash主题动画制作
热门文章
- 计算机视觉领域,计算机视觉
- php怎么弄自动填充,ThinkPHP 自动填充(自动完成)详解及实例
- python 数据去重_python 对数据常用的几种去重方式
- 标签页如何用php静态显示,php使用标签替换的方式生成静态页面
- 判断是否是ie浏览器 前端js_JS判断是否是IE浏览器
- 创建python2与python3虚拟环境失败的原因
- 金融数据信噪比的影响力又一力证
- idea springboot 无法run_2021 最新版 Spring Boot 速记教程
- 使用tab键分割的文章能快速转换成表格。( )_Word 多级列表编号方法总结(一)——快速入门
- AWS DataPipline 的一次尝试。