JavaScript-数据类型
变量求值
用var
或let
语句声明的变量,如果没有赋初始值,则其值为undefined
可以使用undefined
来判断一个变量是否已赋值。在以下的代码中,变量 input
未被赋值,因此if
条件语句的求值结果为true
var input;
if(input === undefined){
doThis();
} else {
doThat();
}
undefined
值在布尔类型环境中会被当作 false
。例如,下面的代码将会执行函数 myFunction
,因为数组 myArray
中的元素未被赋值:
var myArray = [];
if (!myArray[0]) myFunction();
数值类型环境中 undefined
值会被转换为 NaN
。
var a;
a + 2; // 计算为 NaN
当你对一个 null
变量求值时,空值 null
在数值类型环境中会被当作 0 来对待,而布尔类型环境中会被当作 false
。例如:
var n = null;
console.log(n * 32); // 在控制台中会显示 0
变量提升
JavaScript 变量的另一个不同寻常的地方是,你可以先使用变量稍后再声明变量而不会引发异常。这一概念称为变量提升;JavaScript 变量感觉上是被“提升”或移到了函数或语句的最前面。但是,提升后的变量将返回 undefined 值。因此在使用或引用某个变量之后进行声明和初始化操作,这个被提升的变量仍将返回 undefined 值。
/**
* 例子 1
*/
console.log(x === undefined); // true
var x = 3;
/**
* 例子 2
*/
// will return a value of undefined
var myvar = "my value";
(function() {
console.log(myvar); // undefined
var myvar = "local value";
})();
在 ECMAScript 6 中,let
和const
同样会被提升变量到代码块的顶部但是不会被赋予初始值。在变量声明之前引用这个变量,将抛出引用错误(ReferenceError)。这个变量将从代码块一开始的时候就处在一个“暂时性死区”,直到这个变量被声明为止。
函数提升
对于函数来说,只有函数声明会被提升到顶部,而函数表达式不会被提升。
/* 函数声明 */
foo(); // "bar"
function foo() {
console.log("bar");
}
/* 函数表达式 */
baz(); // 类型错误:baz 不是一个函数
var baz = function() {
console.log("bar2");
};
全局变量
实际上,全局变量是全局对象的属性。在网页中,(译注:缺省的)全局对象是 window
,所以你可以用形如 window.
*variable
*的语法来设置和访问全局变量。
因此,你可以通过指定 window 或 frame 的名字,在当前 window 或 frame 访问另一个 window 或 frame 中声明的变量。例如,在文档里声明一个叫 phoneNumber
的变量,那么你就可以在子框架里使用 parent.phoneNumber
的方式来引用它。
常量
对象属性被赋值为常量是不受保护的,所以下面的语句执行时不会产生错误。
const MY_OBJECT = {"key": "value"};
MY_OBJECT.key = "otherValue";
数组的被定义为常量也是不受保护的,所以下面的语句执行时也不会产生错误。
const MY_ARRAY = ['HTML','CSS'];
MY_ARRAY.push('JAVASCRIPT');
console.log(MY_ARRAY); //logs ['HTML','CSS','JAVASCRIPT'];
数据类型的转换
在涉及其它运算符(译注:如下面的减号’-‘)时,JavaScript 语言不会把数字变为字符串。例如(译注:第一例是数学运算,第二例是字符串运算):
"37" - 7 // 30
"37" + 7 // "377"
字符串转换为数字
将字符串转换为数字的另一种方法是使用一元加法运算符。
"1.1" + "1.1" = "1.11.1"
(+"1.1") + (+"1.1") = 2.2
// 注意:加入括号为清楚起见,不是必需的。
- 本文链接:https://archer-lan.github.io/2023/11/20/JavaScript-%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。