深入理解JS中的变量及作用域、undefined与null


Posted in Javascript onMarch 04, 2014

1、Javascript变量作用域

javascript中,变量主要分为局部变量和全局变量两种,对应的作用域也是局部作用域和全局作用域。

1 局部变量和作用域
局部变量一般在函数体内部声明使用:

function func(){
  var i=12;//局部变量
  ......
}

局部变量的作用域在声明这个变量的函数体范围内使用。
局部变量的声明周期从函数被调用执行开始初始化,在函数调用执行完毕之后被销毁。

2、全局变量和作用域

全局变量一般在函数体外面声明:

var i=12;//全局变量
function func(){
  ......
}

还有一种没有声明而直接使用的变量,默认为全局变量:

function func(){
  i=12;//没有被声明(使用var 关键字声明),默认为全局变量
}

全局变量在当前页面中所有的脚本和方法中都可以使用,作用域为当前页面脚本中。
全局变量的声明周期在变量被初始化时被创建,在当前页面关闭的时候被销毁。

2、typeof关键字

typeof关键字主要用来检测变量的数据类型,JavaScript中主要的数据类型有string、number、Boolean、object等

console.log(typeof 'str');//string
console.log(typeof 23);//number
console.log(typeof false);//boolean
console.log(typeof [1,3,12]);//object
console.log(typeof {name:'jack',age:12});//object
console.log(typeof new Date());//object

注意: js中的数组、json对象都是object数据类型的

3、null和undefined

null和undefined在JavaScript中经常出现,表示一个变量的值为空或者是一个变量未被定义。在表示值的时候,都可以表示为空值,但是在数据类型方面还是不一样。

console.log(typeof null);//object
var persion = null;
console.log(persion);//null

console.log(typeof undefined);//undefined
var persion2;
console.log(persion2);//undefined

null的数据类型为object,undefined的数据类型就是undefined。
变量声明,值为null,变量值为null;变量只声明,没有赋值,值为undefined。
再看一组对比:

console.log(null==undefined);//true 值相等
console.log(null===undefined);//false  类型不相等

这就可以看出来,null和undefined的表示值的时候,都表示空;null的数据类型为object,undefined的数据类型就是undefined。只声明而没有初始化的值都是undefined。

下面是补充

Situation One

<script>
var i; //全局变量

//方法名是camel命名法

//方法里面的变量是局部变量


function sayHello(){

var x=100;

alert(x);

x++;

}

sayHello(); //输出100

alert(x); //报错,因为x是局部变量,访问不到
</script>

Situation Two

<script>
function sayHello(){
var x=100;

if(x==100){


var y=x+1;


alert(y); //输出101

}

alert(y); //也输出101,在方法内部,不存在块级作用域,在C#中就不可以了!!!


for(var i=0;i<2;i++){


alert(i)

} //在for循环里面定义的变量是块级作用域

alert(i); //因为i是局部变量,所以输出2

}
sayHello();
</script>

注:变量使用前可以不用var声明,这样的变量会被认为是“全局变量”,但很少这样用

关于undefined与null

有以下几种情况的,变量的值为undefined
1、变量定义,但没有赋值,则变量的值为undefined
2、调用的方法没有返回值,在返回的值为undefined
3、对象的属性值不存在,则返回值为undefined,如:document.ddd

Example1:

var xx;
var yy=null;

if(xx==yy){

alert('相等');

}

else{


alert('不等');
}

输出结果为相等,因为在进行if判断时,浏览器会对xx及yy进行值的判断,因为两者都没有具体的值,认为他们都是false。
如果if判断中换成===[全等于符号],则输出不等!因为===表示要求xx及yy的数据类型和值都要相同才可以!
 
Example2:

var xx=10
var yy='10';

if(xx==yy){

alert('相等');
}

else{


alert('不等');
}

输出相等,如果换成===,则输出不等

Example3:

var n='10';
switch(n){
case 10:



alert('数字');

break;


case '10':



alert('字符串');

break;
}

输出 字符串
switch中的判断要考虑类型

总结:if中的判断是判断数值,不考虑类型

Javascript 相关文章推荐
iframe 自适应高度[在IE6 IE7 FF下测试通过]
Apr 13 Javascript
jQuery表单验证插件formValidator(改进版)
Feb 03 Javascript
原生的html元素选择器类似jquery选择器
Oct 15 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
Nov 16 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
Jan 04 Javascript
JS实现动态修改table及合并单元格的方法示例
Feb 20 Javascript
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
Apr 22 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
May 18 Javascript
vue.js 左侧二级菜单显示与隐藏切换的实例代码
May 23 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
Sep 29 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
Sep 06 Javascript
如何使用three.js 制作一个三维的推箱子游戏
Jul 29 Javascript
css+js实现部分区域高亮可编辑遮罩层
Mar 04 #Javascript
JavaScript程序员应该知道的45个实用技巧
Mar 04 #Javascript
js判断url是否有效的两种方法
Mar 04 #Javascript
js 判断js函数、变量是否存在的简单示例代码
Mar 04 #Javascript
js 事件截取enter按键页面提交事件示例代码
Mar 04 #Javascript
js判断页面中是否有指定控件的简单实例
Mar 04 #Javascript
js实现文本框中焦点在最后位置
Mar 04 #Javascript
You might like
PHP 替换模板变量实现步骤
2009/08/24 PHP
php设计模式 Decorator(装饰模式)
2011/06/26 PHP
php遍历数组的方法分享
2012/03/22 PHP
PHP中$_SERVER的详细参数与说明介绍
2013/10/26 PHP
php类自动加载器实现方法
2015/07/28 PHP
一个实用的php验证码类
2017/07/06 PHP
一次因composer错误使用引发的问题与解决
2019/03/06 PHP
经典的带阴影的可拖动的浮动层
2006/06/26 Javascript
从阿里妈妈发现的几个不错的表单验证函数
2007/09/21 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
使用forever管理nodejs应用教程
2014/06/03 NodeJs
5个书写JavaScript代码的坏习惯,看看你中枪了没?
2014/11/06 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
使用jQuery和ajax代替iframe的方法(详解)
2017/04/12 jQuery
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
js浏览器滚动条卷去的高度scrolltop(实例讲解)
2017/07/07 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
js实现打字小游戏
2019/12/17 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
2020/05/30 jQuery
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
python遍历文件夹并删除特定格式文件的示例
2014/03/05 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
2016/03/30 Python
Python中多线程的创建及基本调用方法
2016/07/08 Python
python实现画圆功能
2018/01/25 Python
python 解决flask 图片在线浏览或者直接下载的问题
2020/01/09 Python
HTML5 device access 设备访问详解
2018/05/24 HTML / CSS
伦敦高达60%折扣的钻石珠宝商:Purely Diamonds
2018/06/24 全球购物
员工辞职信怎么写
2015/02/27 职场文书
收入证明申请书
2015/06/12 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
竞聘演讲报告:基本写作有哪些?附开头范文
2019/10/16 职场文书
解决vue $http的get和post请求跨域问题
2021/06/07 Vue.js
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js