整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

javascript中typeof的总结

先要给出的当然是这张值表:

从这张表可以看出,如果需要用typeof来判断类型,只有‘boolean’、‘number’、’string’、‘function’三种类型是靠谱儿的,用于判断其他类型会出现不可预期的错误~请谨慎使用~

针对typeof的软肋,我们有一些比较好的解决方式:

判断Array 要使用Array.isArray(arr);

判断null请使用myVar === null;

判断某个全局变量是否存在用typeof window.myVar=== ‘undefined’;

函数内部判断某个变量是否存在用typeof myVar === ‘undefined’。

但是通过以上解决方法,我们还是没有办法判断 typeof myVar === ‘undefined’的时候具体是定义还是未定义

于是我们想出了另外一种解决方案,可以封装成一个函数:

本文中,将简述JavaScript类型系统和数据类型,以及如何使用typeof操作符执行类型检查。

还讲解了使用typeof操作符进行某些数据类型检查是不完善的,并介绍其他几种类型检查的方法。

每种编程语言都有自己的类型系统和数据类型,但各种编程语言的数据结构常有不同之处。使用JavaScript时,其引擎会在脚本执行期间隐式强制转换执行值的类型。类型检查对于编写可预测的JavaScript程序是非常有必要的。


JavaScript中的typeof操作符就是用于基础的类型检查

typeof操作符返回字符串,表示未经计算的操作数的类型(来自MDN)

一、JavaScript的数据类型

在此之前,需要了解JavaScript有哪些数据类型,最新标准定义了8种数据类型:

  • 7种原始类型:
  • Boolean
  • Null
  • Undefined
  • Number
  • String
  • BigInt
  • Symbol
  • 其他为引用类型:
  • Object
  • 数组array()、函数function()、正则表达RegExp特殊的物体:
  • array是一种特殊的对象,它是一个有序的编号值集合
  • function是一种特殊类型的对象,具有与之关联的可执行脚本块有关

JavaScript还有几个对象类构造函数,用于创建其他类型的对象:

  • Date—用于创建日期对象
  • RegExp—用于创建正则表达式
  • Error—用于创建JavaScript错误

二、typeof功能

1、语法

typeof使用一元操作符(只需要一个操作数)的计算结果作为其操作数的类型结果字符串。

另一种替代语法就是将操作数放入括号中使用,这种对JavaScript表达式返回的值进行类型检查非常有用。

typeof 参数
typeof(参数)

参数:一个表示对象或原始值的表达式,其类型将被返回

typeof "sueRimn"; // 'string'
typeof 22; // 'number'
typeof NaN; // 'number'
typeof Infinity; // 'number'
typeof true; // 'boolean'
typeof false; // 'boolean'
typeof [1, 2]; // 'object'
typeof {age: 22}; // 'object'
typeof null; // 'object'
typeof undefined; // 'undefined' 
typeof String; // 'function'
typeof Boolean; // 'function' 
typeof Number; // 'function'
typeof Object; // 'function'
typeof Function; // 'function'
typeof person; // 'function'

undefined是它自己的JavaScript类型

在ES6之前,typeof不管操作数是否声明,总是返回一个字符串,即对于未声明的标识符,总是返回而不是抛出错误。

在ES6中,使用let或const声明的块级作用域变量在初始化之前与typeof操作符使用,将抛出错误。

原因是:块级作用域变量在被初始化之前一直保留在临时死区。

console.log(typeof name === 'undefined'); // ReferenceError
const name = 'sueRimn';


2、一般类型检查

在JavaScript中执行类型检查主要使用typeof操作符

function add(a, b) {
 if (typeof a !== 'number' || typeof b !== 'number') {
 throw '参数必须是数值'
 }
 return a + b;
}

以下是对类型检查的简单摘要:


检测值是否存在在不同环境是这样的:

if (typeof window !== 'undefined') {
 // 浏览器
};
if (typeof process !== 'undefined') {
 // Node.js
}
if (typeof $ !== 'undefined') {
 // jQuery 
}

3、其他类型检查

对于某些值需要额外的类型检查才可以区分,例如null和[]在使用typeof操作符执行type-check时都是"object"类型,但是区分它们需要额外的操作。

一些其他数据类型值检查方法

  • 使用instanceof
  • 检查对象的constructor属性
  • 使用对象的toString()方法检查对象类

(1)检测是否为空

使用typeof操作符检查值是否为空并不好,检查值是否为空的最佳方法是对值与关键字进行严格相等比较。

以上代码呈现的结果是不一样的,所以使用严格相等操作符是非常重要的。

(2)检测NaN

任何涉及NaN的算术运算都将对NaN求值,如果想为任何形式的算术运算使用值,那么需要确保该值不是NaN。

使用typeof操作符检查NaN值是否返回"number"。要检查NaN值,可以使用全局函数isNaN(),或者ES6中的Number.isNaN()函数:

NaN值非常特殊,通过比较,它永远不等于任何其他值,包括它自己:

可以使用以下方法在非ES6环境下检测NaN:

function isNan(value) {
 return value !== value;
}

最后,你可以利用ES6中的Object.is()函数来测试值是否为NaN。

以下函数作用是检查两个值是否相同:

function isNan(value) {
 return Object.is(value, Number.NaN);
}

(3)检测数组

使用typeof检查数组将返回object。这里介绍几种检测数组的方法,并进行对比:

  • 使用constructor属性(不推荐)
function isArray(value) {
 return typeof value == 'object' && value.constructor === Array;
}
  • 使用instanceof(不推荐,因为对象的原型可以更改)
function isArray(value) {
 return value instanceof Array;
}
  • 使用Object.prototype.toString()(推荐,类似于ES6 Array.isArray())
function isArray(value) {
 return Object.prototype.toString.call(value) === '[object Array]';
}

object.prototype.tostring()方法对于检查任何JavaScript值的对象类型都非常有用

  • 使用ES6 Array.isArray()

么是JS延迟加载?

JS延迟加载,也就是等页面加载完成之后再加载JavaScript文件

为什么让JS实现延迟加载?

js的延迟加载有助于提高页面的加载速度。

Js延迟加载的方式有哪些?一般有以下几种方式:

·defer属性

·async属性

·动态创建DOM方式

·使用jQuery的getScript方法

·使用setTimeout延迟方法

·让JS最后加载

1、defer属性

HTML 4.01为<script>标签定义了defer属性。标签定义了defer属性元素中设置defer属性,等于告诉浏览器立即下载,但延迟执行标签定义了defer属性。

用途:表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕之后再执行在<script>元素中设置defer属性,等于告诉浏览器立即下载,但延迟执行

<!DOCTYPE html>
<html>
<head>
	<script src="test1.js" defer="defer"></script>
	<script src="test2.js" defer="defer"></script>
</head>
<body>
<!--这里放内容-->
</body>
</html>

说明:虽然<script>元素放在了<head>元素中,但包含的脚本将延迟浏览器遇到</html>标签后再执行HTML5规范要求脚本按照它们出现的先后顺序执行。在现实当中,延迟脚本并不一定会按照顺序执行defer属性只适用于外部脚本文件。支持HTML5的实现会忽略嵌入脚本设置的defer属性

2、async属性

HTML5 为<script>标签定义了async属性。与defer属性类似,都用于改变处理脚本的行为。同样,只适用于外部脚本文件。标签定义了async属性。与defer属性类似,都用于改变处理脚本的行为。同样,只适用于外部脚本文件。

目的:不让页面等待脚本下载和执行,从而异步加载页面其他内容。异步脚本一定会在页面 load 事件前执行。不能保证脚本会按顺序执行

<!DOCTYPE html>
<html>
	<head>
		<script src="test1.js" async></script>
		<script src="test2.js" async></script>
	</head>
<body>
<!--这里放内容-->
</body>
</html>

async和defer一样,都不会阻塞其他资源下载,所以不会影响页面的加载。

缺点:不能控制加载的顺序

3、动态创建DOM方式

//这些代码应被放置在</ body>标签前(接近HTML文件底部)
<script type="text/javascript">
	function downloadJSAtOnload() {
		varelement = document .createElement("script");
		element.src = "defer.js";
		document.body.appendChild(element);
	}
	if (window. addEventListener)
		window.addEventListener("load" ,downloadJSAtOnload, false);
	else if (window.attachEvent)
		window.attachEvent("onload", downloadJSAtOnload) ;
	else
		window. onload =downloadJSAtOnload;
</script>

4、使用jQuery的getScript()方法

$.getScript("outer.js" , function(){	//回调函数,成功获取文件后执行的函数
	console.log(“脚本加载完成")
});

5、使用setTimeout延迟方法的加载时间延迟加载js代码,给网页加载留出更多时间

<script type="text/javascript" >
	function A(){
		$.post("/1ord/1ogin" ,{name:username,pwd:password},function(){
			alert("Hello");
		});
	}
	$(function (){
		setTimeout('A()', 1000);	//延迟1秒
	})
</script>

6、让JS最后加载

把js外部引入的文件放到页面底部,来让js最后引入,从而加快页面加载速度例如引入外部js脚本文件时,如果放入html的head中,则页面加载前该js脚本就会被加载入页面,而放入body中,则会按照页面从上倒下的加载顺序来运行JavaScript的代码。所以我们可以把js外部引入的文件放到页面底部,来让js最后引入,从而加快页面加载速度。

上述方法2也会偶尔让你收到Google页面速度测试工具的“延迟加载javascript”警告。所以这里的解决方案将是来自Google帮助页面的推荐方案。

//这些代码应被放置在</body>标签前(接近HTML文件底部)

<script type= "text/javascript">
	function downloadJSAtonload() {
		var element = document.createElement("script");
		element.src = "defer.js";
		document.body.appendChild(element);
	}
	if (window.addEventListener)
		window.addEventListener("load", downloadJSAtOnload, false);
	else if (window.attachEvent )
		window.attachEvent("onload", downloadJSAtonload);
	else window.onload = downloadJSAtOnload;
</script>

这段代码意思等到整个文档加载完后,再加载外部文件“defer.js”。

使用此段代码的步骤:

6.1)复制上面代码

6.2)粘贴代码到HTML的标签前 (靠近HTML文件底部)

6.3)修改“defer.js”为你的外部JS文件名

6.4)确保文件路径是正确的。例如:如果你仅输入“defer.js”,那么“defer.js”文件一定与HTML文件在同一文件夹下。

注意:

这段代码直到文档加载完才会加载指定的外部js文件。因此,不应该把那些页面正常加载需要依赖的javascript代码放在这里。而应该将JavaScript代码分成两组。一组是因页面需要而立即加载的javascript代码,另外一组是在页面加载后进行操作的javascript代码(例如添加click事件。