JavaScript是一门挺神奇的语言,作为一个写惯了OC的iOS客户端,刚一上手感觉人生一下子就黯淡了。由于公司正在进行React Native的技术学习,JavaScript成为了不可跨越的一关。React Native现在已经基本熟悉了,但是回过头来突然发现自己这几个月从来没系统的学过JavaScript。
概述
先提前说一句,本章不会涉及过多的JavaScript重点知识,只是简单介绍JavaScript的一些基本认识。
JavaScript是一种解释型的语言,什么是解释型,就是你写完代码之后,运行时需要一个‘解释器’帮你将代码翻译成计算机识别的机器码。与之对应的编译型语言,像OC、C++等,都是依赖编译器,在计算机运行代码前,会进行编译,其实就是我们平时常用的cmd+B(Xcode)过程。
另外,其实JavaScript和Java除了名字里都有Java这四个字母,基本就没有共同点了,JavaScript更不是Java的脚本版语言,听说是当时命名时,Java比较火,所以活用一下IP,可能会更方便宣传。实际上,对我而言,JavaScript比Java好学倒是真的。
ECMAScript标准可以说是控制JavaScript的各个方面,再次不过多介绍,有兴趣自行百度学习,此处可能涉及ES 6相关的知识。
数据类型与变量
我们都知道的一点就是JavaScript是一种弱类型语言,有时候处理数据的时候不需要指定类型,JavaScript会自己判断其类型,但有时候JavaScript的推断结果会与我们预期的结果不一致,所以灵活的表示类型,不仅安全而且高效。常用的数据类型:数值、文本和布尔。
数值,分为整数和小数(浮点),至于具体的数值范围和精度,就目前阶段而言,并没有什么用,反正一般没有需要科学计算的业务。
文本数据,说白的就是放在单引号或双引号之间的字符串,需要注意的就是,JavaScript里,单引号和双引号,其实没有区别,只是使用的时候需要统一,'Hello" 是无效的,另一个有效的写法就是"Hello wor'd",但是"Hello wor"d"是无效的,其实需要在字符串中显示引号时一般都是使用转义字符如:' 和 ",其他转义字符不过多介绍,与其他语言基本是一致的。
布尔数值,只有两个值,是(true)和 否(false),一般配合判断语句使用
变量,一提到这两个字,大家感到熟悉之余肯定会想到与之对应的常量,那么恭喜你,因为JavaScript没有严格意义上的常量,ES 6之后const可以看作常量声明。JavaScript中使用var定义变量,这一点和swift中很像,有人可能会猜想let可能是在JavaScript中用于定义常量的,但很可惜,JavaScript中虽然有let关键字,但却不是用于常量声明。
var — 声明变量的主要关键字,var声明的变量之后,将会告诉计算机保留一部分内存用于存储变量数据。在进行声明时可以不指定数据类型,JavaScript可以自行推断。
var number = 1;//number此处是数值型
var number = '1';//number此处是文本数据
另外,值得注意的一点是,var 定义的变量具有变量提升的效果,如下:
function test(){
for(i in someArray){
//do something
var i ;
}
//此处可以访问到i,并且程序不会报错,可以正常执行循环
}
let — ES 6之后定义变量的关键字,用于定义块变量,类似于局部变量,而let与var的不同,如下所示
function test (){
for(var i in someArray){
let j = '22';
}
//此处仍可以访问到变量i,但是访问不到变量j
}
const — ES 6 之后另一种定义变量的关键字,类似于定义常量,被const定义的变量不可被修改且定义时必需赋值。
const test = 'test';//正确
const test1;//错误
test = 'another';//错误
关于计算
数值的数学运算和逻辑运算,与其他语言无异。
关于文本数据,在进行合并时使用符号‘+’。
值得注意的是,当进行数值和文本混合计算时,使用符号‘+’进行连接,但由于JavaScript自动推断类型的特点,某些情况下会存在差异。
var mix = 'my name is'+123;//结果为'my name is 123',string类型
var mix1 = '1'+1;//结果为'11',string类型
var mix2 = 1+2+'abc';//结果为'3abc',string类型
var mix3 = 'abc'+1+2;//结果为'abc12',string类型
关于数值和文本类型转换
两者之间的转换可以通过转换函数实现
1. parseInt( )
parseInt()函数,将一个文本数据转换为int类型的数据,也就是整型,该函数可以传入两个参数,第一个参数为要转换的文本,第二个参数为要转换的进制,注意如果不给第二个参数,JavaScript会推断转换的数值类型,也就是进制,并不是默认为十进制。
parseInt("10"); //返回 10
parseInt("19",10); //返回 19 (10+9)
parseInt("11",2); //返回 3 (2+1)
parseInt("17",8); //返回 15 (8+7)
parseInt("1f",16); //返回 31 (16+15)
parseInt("010"); //未定:返回 10 或 8
如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。
如果 string 以 0 开头,parseInt() 的把其后的字符解析为八进制或十六进制的数字。
如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。
如果string不为数值,则返回NaN(Not a Number)。
2.parseFloat( )
parseFloat()函数,将一个文本数据转换为float类型的数据,也就是浮点型,该函数可传入一个参数,为要转换的文本。
parseFloat() 将它的文本参数解析成为浮点数并返回。如果在解析过程中遇到了正负号(+ 或 -)、数字 (0-9)、小数点,或者科学记数法中的指数(e 或 E)以外的字符,则它会忽略该字符以及之后的所有字符,返回当前已经解析到的浮点数。若想取浮点数的整数部分,则使用parseInt()方法。
parseFloat("23.33") //返回 23.33
parseFloat("40 a") //返回 40
3.isNaN( )
isNaN( )函数,用于检查其传入参数是否是非数字值。
如果参数是特殊的非数字值 NaN(或者能被转换为这样的值),返回的值就是 true。如果参数是其他值,则返回 false。总而言之,参数要是不是数值或者不可转换为数值,就返回true,反之,返回false。
isNaN(1); //false
isNaN("1"); //false
isNaN("abc"); //true
isNaN(0X1f); //false
4.toString( )
toString( )函数,其中一种用法是可以将数值转换为文本,但该函数不是全局函数,需要数值对象进行调用。
var number=12;
number.toString(); // 12
number.toString(2); // 1100
number.toString(8); // 14
number.toString(10); // 12
number.toString(16); // c
关于判断与循环
与C语言基本一致,不需要重复学习。值得注意的有两点:
- ‘==’与‘===’的区别
虽然两种都用于比较,但是功能并不完全相同,如果将==视为等于,那么 ===可以视为严格等于。
当两个对象或类型进行==比较时,若两者类型不同,则想转换为统一类型在进行比较,而对于===来说,类型不同,就一定不相等。
1 == '1' //true
1 === '1' //false
null == undefined // true
null === undefined // false
1 == true //true
1 === true //false
- forin 和 forof
forin和forof是两种循环的写法(格式),示例如下
for (let i of ['1a','2b','3c']) {
//此处读到的i为数据。
}
for (var i in ['1a','2b','3c']) {
//此处读到的i为数组下标。
}
另外,第二个循环中使用了var,由于var变量提升的特性,在第二个for循环之外,还是可以读到var声明的变量,所以,若是所处的JavaScript环境支持ES 6,则在进行for循环时,尽量使用let定义。