资讯专栏INFORMATION COLUMN

《javascript高级程序设计》笔记:变量及变量检测

XiNGRZ / 2924人阅读

摘要:变量的特点变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。

变量的特点

js变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。换句话说, 每个变量仅仅是一个用于保存值的占位符而已

js变量可以用来保存任何值,未经过初始化的变量,会保存一个特殊的值—undefined,如:var msg;

js变量的初始化并不会为它标记类型;初始化的过程就是给变量赋一个值那么简单。因此,可以在修改变量值的同时修改值的类型(不推荐)

js变量的生命周期就是其所在的作用域,因此不推荐在全局内定义变量(内存泄漏)

js变量直接声明时,会创建一个全局变量,严格模式下会报错 function test(){ msg = "hi"; }

可以使用一条语句定义多个变量,只要像下面这样把每个变量(初始化或不初始化均可)用逗号分隔开即可

var message = "hi",
    found = false,
    age = 29;

变量的分类和检测

ECMAScript 中有 5 种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number 和 String。还有 1 种复杂数据类型—Object,Object 本质上是由一组无序的键值对组成的

1. 变量检测—typeof

typeof始终返回的是下列的某个字符串
"undefined"—如果这个值未定义;
"boolean"—如果这个值是布尔值;
"string"—如果这个值是字符串;
"number"—如果这个值是数值;
"object"—如果这个值是对象或 null;
"function"—如果这个值是函数;

注意:
特殊值null被认为是一个空的对象引用,因此typeof null === "object"
typeof会将函数类型识别为"function",虽然函数不是多带带的数据类型

var s = "Nicholas";
var b = true;
var i = 22;
var u;
var n = null;
var o = new Object();
var f = new Function();

alert(typeof s); //string
alert(typeof i); //number
alert(typeof b); //boolean
alert(typeof u); //undefined
alert(typeof n); //object
alert(typeof o); //object
alert(typeof f); //function

typeof 操作符是确定一个变量是字符串、数值、布尔值,还是 undefined 的最佳工具。如果变量的值是一个对象或 null,则 typeof 操作符会像下面例子中所示的那样返回"object",我们依然无法确定对象的具体类型...

2. 变量检测—instanceof

语法: result = variable instanceof constructor
如果变量是给定引用类型(根据它的原型链来识别)的实例,那么 instanceof 操作符就会返回 true

alert(person instanceof Object);
alert(colors instanceof Array);
alert(pattern instanceof RegExp);

注意:

在检测一个引用类型值和 Object 构造函数时,instanceof 操作符始终会返回 true,因为所有引用类型的值都是 Object 的实例

如果使用 instanceof 操作符检测基本类型的值,则该操作符始终会返回 false,因为基本类型不是对象

instanceof 能够确定引用类型的实例对象是否在某条原型链上,但是无法精准的判断变量到底是什么类型,而且在面对基本类型时都会返回false...

3. 变量检测—Obect.prototype.toString

这个方法是检测数据类型最准确的方法(在不认为更改对象原型方法toString的前提下),建议将其封装为函数做判别

Object.prototype.toString.call(123) //"[object Number]"
Object.prototype.toString.call("123") //"[object String]"
Object.prototype.toString.call(undefined) //"[object Undefined]"
Object.prototype.toString.call(true) //"[object Boolean]"
Object.prototype.toString.call({}) //"[object Object]"
Object.prototype.toString.call([]) //"[object Array]"
Object.prototype.toString.call(function(){}) //"[object Function]"
Object.prototype.toString.call(new Date) // "[object Date]"

函数封装:

// 判断是否为函数
function isFunction(fn) {
  return Object.prototype.toString.call(fn) === "[object Function]";
}

// 判断是否为数组
function isArray(o) { 
  return Object.prototype.toString.call(o) === "[object Array]";  
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84707.html

相关文章

  • JavaScript高级程序设计》(第3版)读书笔记 第4章 变量、作用域和内存问题

    摘要:具体说就是执行流进入下列任何一个语句时,作用域链就会得到加长语句的块。如果局部环境中存在着同名的标识符,就不会使用位于父环境中的标识符访问局部变量要比访问全局变量更快,因为不用向上搜索作用域链。 基本类型和引用类型的值 ECMAscript变量包含 基本类型值和引用类型值 基本类型值值的是基本数据类型:Undefined, Null, Boolean, Number, String ...

    lidashuang 评论0 收藏0
  • JavaScript高级程序设计笔记:BOM(八)

    摘要:浏览器对象模型提供了很多对象,用于访问浏览器的功能,这些功能与任何网页内容无关。对象基本上只用来表明客户端的能力。 BOM(浏览器对象模型)提供了很多对象,用于访问浏览器的功能,这些功能与任何网页内容无关。 window对象 全局作用域 定义全局变量与在window对象上直接定义属性还是有一点差别:全局变量不能通过delete操作符删除,而直接在window对象上的定义的属性可以。 v...

    mushang 评论0 收藏0
  • JavaScript高级程序设计笔记变量、作用域、内存问题

    摘要:作用域链中的下一个变量对象来自包含外部环境,而再下一个变量对象则来自下一个包含环境。这样,一直延续到全局执行环境全局执行环境的变量对象始终都是作用域链中的最后一个对象标识符解析沿作用域链一级一级搜索标识符。 一、写在前面 最近研究了创建Android虚拟机、vscode结合weex开发Android APP、Vmware装MAC虚拟机的事,看的内容不够多,接下来加油 二、变量、作用域和...

    U2FsdGVkX1x 评论0 收藏0
  • JavaScript高级程序设计》读书笔记

    摘要:为了每个对象都能通过来检测,需要以或者的形式来调用,传递要检查的对象作为第一个参数,称为。对象都是动态的,这就意味着每次访问对象,都会运行一次查询。是语言中立的用于访问和操作和文档。 一、第三章 基本概念: 1.理解参数 1.1 可以向函数中传递任意数量的参数,并且可以通过arguments对象来访问这些参数。 1.2 arguments对象只是类似数组,它通过length来确定传进来...

    dayday_up 评论0 收藏0
  • javascript高级程序设计笔记:undefined和null

    摘要:表示没有对象,即该处不应该有值。典型用法是作为函数的参数,表示该函数的参数不是对象。作为对象原型链的终点。表示缺少值,就是此处应该有一个值,但是还没有定义。 undefined 和 null 的简单介绍 undefined 和 null 都是简单数据类型,且对应的我数据类型下有且仅有一个值,分别为undefined和null; 《javascript高级程序设计》书中这样描述: 在使用...

    codeKK 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<