学习目标:
- 掌握JavaScript中是定义和初始化变量的方法
- 掌握JavaScript中的七种数据类型
- 掌握JavaScript中的作用域原则
- 理解程序中变量的概念
- 理解什么是作用域
- 理解为什么需要有作用域
1、变量
和以前的很多语言是一样的,变量就是用来存储信息的。
javaScript变量:在JS中,变量是松散类型,所谓松散类型就是可以用变量来保存任何类型的数据,也就是说每个变量只是一个用户保存值的占位符,在JS中定义变量使用var来声明一个变量,后面紧跟一个变量名,变量名必须是合法的标识符。这个定义变量很多语言都是一样的规则。
var message = 'Hello World'; // Right!
var 2age = 30; // Wrong! 变量名不能以数字开头
声明(创建)JS变量:我们也可以像下面这样声明一个变量:
var information;
上面这行代码定义了一个information的变刘昂,这个变量可以存储任何类型的值,,因为它没有初始化,会保存一个特殊的值(undefined)。在JS中当一个变量已经被声明和初始化之后还可以对和变量的值进行修改。如下:
var name = "Mike";
name = "Bob";
//但是不建议这样做,虽然是有效的。
name = 10;
定义多个变量时,可以如下放在一行中定义,也可以放在多行。
var name="Zhang" , age = 10 ,stuNo = 17042;
value值为undefined,在计算机程序中,经常会有声明为无值的变量,在JS中这种变量的值是undefined。重新声明JS变量,之前定义的值不会丢失。
2、数据类型
JavaScript是一种弱类型或者说动态语言,这意味着不用提前声明变量的类型,在程序运行过程中类型会被自动确定,这意味着可以使用一个变量保存不同类型的数据。
var foo = 12;
var foo = "bob";
var foo = true;
在JavaSpcript规范中共定义了7种数据类型,分为基本类型和引用类型两类。
基本类型:String,Number,Boolean,Symbol、Undefined,Null。
引用类型:Object。
1、字符串类型
JavaScript的字符串类型用于表示文本数据。在字符串中的每个元素占据了字符串的位置。第一个元素的索引为0,下一个是索引1,依此类推。
字符串的长度是它的元素的数量。在JavaScript中的字符串需要使用单引号'**'
或双引号"**"
括起来,表示该值是一个字符串。JavaScript 字符串是不可更改的。这意味着字符串一旦被创建,就不能被修改。但是,可以基于对原始字符串的操作来创建新的字符串。例如:获取一个字符串的子串可通过选择个别字母或者使用String.substr()
。两个字符串的连接使用连接操作符 (+
) 或者String.concat()
。
符号类型(Symbol):符号(Symbols)是ES6新定义的。符号类型是唯一的并且是不可修改的。
2、Number
Number类型包含整数和浮点数(浮点数数值必须包含一个小数点,且小数点后面至少有一位数字)两种值。
3、布尔类型(boolean)
布尔表示一个逻辑实体,意为真、假,可以有两个值:true
和false
。
4、Symbol
Symbol 是 ES6 新增的一种原始数据类型,它的字面意思是:符号、标记。代表独一无二的值 。
5、Undefined和Null
Undefined 这个值表示变量不含有值。
Null 类型只有一个值:null
,表示空值,表示没有被呈现
可以通过将变量的值设置为 null 来清空变量。
6、对象(Object)
和其他语言的对象的概念是一样的。对象可以通过new操作符后跟要创建的对象的类型名称来创建,而创建Object类型的示例并为其添加属性和方法,就可以创建自定义对象。如下所示:
var o = new Object();
//也可以通过下面的方式直接创建一个对象
//定义了一个名为mike,年龄20的男生
var person = {name:'Mike',age:20,gender:'male'};
7、typeof 操作符
由于JavaScript是松散类型,需要一种手段检测给定变量的数据类型---typeof就是负责提供这方面信息的操作符,对一个值使用typeof操作符就可能返回下列的字符串:
'undefined' —— 未定义
'boolean' —— 布尔值
'string' —— 字符串
'number' —— 数字值
'object' —— 对象或null
function —— 函数
下面展示typeof的用法:实际编程中可以用typeof判断任何一个变量的数据类型
var message = 'some string';
//alert是显示一个指定消息
alert(typeof message); // "string"
alert(typeof(message)); // "string"
alert(typeof 95); // number
3、作用域
作用域被用来描述某个代码块课件的所有实体(或有效的标识符)。
作用域可以保证最小访问原则,作用域为你的代码提供了一个安全层级。
作用域的很多概念和其他语言是一样的,JS需要查询一个变量时,会按照一个作用域链来查找。
函数体内部,局部变量的优先级比同名的全局变量高。
没有块级作用域,只有函数作用域。如下代码,这里和C++不同。
<script type="text/javascript">
function rainman(){
// rainman函数体内存在三个局部变量 i j k
var i = 0;
if ( 1 ) {
var j = 0;
for(var k = 0; k < 3; k++) {
alert( k ); //分别弹出 0 1 2
}
alert( k ); //弹出3
}
alert( j ); //弹出0
}
</script>
函数中声明的变量在整个函数中都有定义。如下
<script type="text/javascript">
function rain(){
var x = 1;
function man(){
x = 100;
}
man(); //调用man
alert( x ); //这里会弹出 100
}
rain(); //调用rain
</script>
上面代码说明了变量x,在整个函数体内都可以使用,并且可以重新赋值。因为这样有时候会造成一些问题。如下
<script type="text/javascript">
var x = 1;
function rain(){
alert( x ); //弹出 'undefined',而不是1
var x = 'rain-man';
alert( x ); //弹出 'rain-man'
}
rain();
</script>
函数rain隐藏了同名的全局变量x。所以会弹出undefined。
未使用var let const关键字声明的变量都是全局变量。全局变量都是windows对象的属性。
<script type="text/javascript">
var x = 100 ;
alert( window.x );//弹出100
alert(x);
</script>
//等同于下面的代码
<script type="text/javascript">
window.x = 100;
alert( window.x );
alert(x)
</script>