深入理解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 jsFiddle JSBin在线调试器
Mar 14 Javascript
一些实用的jQuery代码片段收集
Jul 12 Javascript
jquery创建并行对象或者合并对象的实现代码
Oct 10 Javascript
javascrip关于继承的小例子
May 10 Javascript
Javascript对象属性方法汇总
Nov 21 Javascript
JS实现HTML表格排序功能
Aug 05 Javascript
fullpage.js全屏滚动插件使用实例
Sep 06 Javascript
ionic中列表项增加和删除的实现方法
Jan 22 Javascript
Js实现中国公民身份证号码有效性验证实例代码
May 03 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
Aug 14 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
Apr 04 Javascript
动态实现element ui的el-table某列数据不同样式的示例
Jan 22 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
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
社区(php&amp;&amp;mysql)四
2006/10/09 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
PHP弱类型的安全问题详细总结
2016/09/25 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
浅谈Javascript中的Function与Object
2015/01/26 Javascript
js模仿java的Map集合详解
2016/01/06 Javascript
jquery 中toggle的2种用法详解(推荐)
2016/09/02 Javascript
Angular2+如何去除url中的#号详解
2017/12/20 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
javascript/jquery实现点击触发事件的方法分析
2019/11/11 jQuery
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
Python中apply函数的用法实例教程
2014/07/31 Python
Python yield 使用方法浅析
2017/05/20 Python
Python中字典(dict)合并的四种方法总结
2017/08/10 Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
2018/02/13 Python
python实现简单http服务器功能
2018/09/17 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
python类的实例化问题解决
2019/08/31 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
Django框架 Pagination分页实现代码实例
2019/09/04 Python
实现Python与STM32通信方式
2019/12/18 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
2020/05/11 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
使用html2canvas将页面转成图并使用用canvas2image下载
2019/04/04 HTML / CSS
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
我未来的职业规划范文
2014/01/11 职场文书
家长会邀请书
2014/01/25 职场文书
《充气雨衣》教学反思
2014/04/07 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
python实现简易自习室座位预约系统
2021/06/30 Python
联想win10摄像头打不开怎么办?win10笔记本摄像头打不开解决办法
2022/04/08 数码科技