深入理解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 相关文章推荐
一个加密JavaScript的开源工具PACKER2.0.2
Nov 04 Javascript
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
Nov 07 Javascript
js一组验证函数
Dec 20 Javascript
详解JavaScript基于面向对象之继承
Dec 13 Javascript
jQuery EasyUI常用数据验证汇总
Sep 18 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
Nov 18 Javascript
解决微信二次分享不显示摘要和图片的问题
Aug 18 Javascript
关于Promise 异步编程的实例讲解
Sep 01 Javascript
简单谈谈vue的过渡动画(推荐)
Oct 11 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 Javascript
jQuery-Citys省市区三级菜单联动插件使用详解
Jul 26 jQuery
jQuery实现购物车全功能
Jan 11 jQuery
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脚本的10个技巧(6)
2006/10/09 PHP
PHP用户指南-cookies部分
2006/10/09 PHP
php开发过程中关于继承的使用方法分享
2011/06/17 PHP
PHP会话控制实例分析
2016/12/24 PHP
javascript之大字符串的连接的StringBuffer 类
2007/05/08 Javascript
js闭包的用途详解
2014/11/09 Javascript
实现placeholder效果的方案汇总
2015/06/11 Javascript
举例说明如何为JavaScript的方法参数设置默认值
2015/11/17 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
什么是JavaScript注入攻击?
2016/09/14 Javascript
javascript 解决浏览器不支持的问题
2016/09/24 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
2016/11/01 Javascript
AngularJS入门教程之Helloworld示例
2016/12/25 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
微信小程序input框中加入小图标的实现方法
2018/06/19 Javascript
JSONP原理及应用实例详解
2018/09/13 Javascript
详解vuex状态管理模式
2018/11/01 Javascript
Vue 无限滚动加载指令实现方法
2019/05/28 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
python实现教务管理系统
2018/03/12 Python
numpy下的flatten()函数用法详解
2019/05/27 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
Anaconda使用IDLE的实现示例
2020/09/23 Python
Blue Nile蓝色尼罗河香港官网:世界最大在线钻石珠宝销售商
2020/05/07 全球购物
自我鉴定的范文
2013/10/03 职场文书
财务工作者先进事迹材料
2014/01/17 职场文书
手工社团活动方案
2014/02/17 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
跑出一片天观后感
2015/06/08 职场文书