深入理解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获取GridView中用户点击控件的行号,列号
Apr 14 Javascript
删除select中所有option选项jquery代码
Aug 12 Javascript
javascript中parentNode,childNodes,children的应用详解
Dec 17 Javascript
使用控制台破解百小度一个月只准改一次名字
Aug 13 Javascript
初步了解javascript面向对象
Nov 09 Javascript
react.js 翻页插件实例代码
Jan 19 Javascript
巧用weui.topTips验证数据的实例
Apr 17 Javascript
详解Vue.js搭建路由报错 router.map is not a function
Jun 27 Javascript
Vue-路由导航菜单栏的高亮设置方法
Mar 17 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
Apr 08 Javascript
jQuery实现鼠标移入移出事件切换功能示例
Sep 06 jQuery
Intellij IDEA搭建vue-cli项目的方法步骤
Oct 20 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
深入file_get_contents与curl函数的详解
2013/06/25 PHP
5 cool javascript apps
2007/03/24 Javascript
jquery tablesorter.js 支持中文表格排序改进
2009/12/09 Javascript
js中哈希表的几种用法总结
2014/01/28 Javascript
移动设备web开发首选框架:zeptojs介绍
2015/01/29 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
基于jQuery实现动态搜索显示功能
2016/05/05 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
js弹性势能动画之抛物线运动实例详解
2017/07/27 Javascript
一个简单的node.js界面实现方法
2018/06/01 Javascript
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
jQuery实现的老虎机跑动效果示例
2018/12/29 jQuery
Node.js使用supervisor进行开发中调试的方法
2019/03/26 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
JavaScript实现原型封装轮播图
2020/12/27 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
py2exe 编译ico图标的代码
2013/03/08 Python
python利用不到一百行代码实现一个小siri
2017/03/02 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
检测浏览器对HTML5和CSS3支持度的方法
2015/06/25 HTML / CSS
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
加拿大最大的书店:Indigo
2017/01/01 全球购物
Timberland法国官网:购买靴子、鞋子、衣服、夹克和配饰
2019/11/30 全球购物
在什么时候需要使用"常引用"
2015/12/31 面试题
学年末自我鉴定
2014/01/21 职场文书
高一物理教学反思
2014/01/24 职场文书
飘柔洗发水广告词
2014/03/14 职场文书
五水共治一句话承诺
2014/05/30 职场文书
实习单位推荐信
2015/03/27 职场文书
搬迁通知
2015/04/20 职场文书
大学生村官入党自传
2015/06/26 职场文书
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL
JVM之方法返回地址详解
2022/02/28 Java/Android
【海涛教你打DOTA】死灵飞龙第一视角解说
2022/04/01 DOTA