JavaScript基础笔记1 (数据类型)
JavaScript 是一种解释型脚本语言,和python比较类似(逐行解释代码,遇到语法错误程序停止),和html的文本标识语言不一样。
也有人说JavaScript是和C语言类似的编译型语言?用编译器将代码转化为低级语言之后执行。但是官方说法是JavaScript是解释型语言,浏览器中有JavaScript的解释器,也叫JavaScript引擎。
无论是编译型还是解释性语言,比较现实的一点是:如果js代码中有语法错误,就像C语言一样编译错误,就会无法运行。有时代码中有一个格式小错误,导致整个代码功能无法实现,就像文件和浏览器坏掉一样。
按F12打开浏览器的控制台,Sources里可以找到你的html文件和js文件,单独把js文件提出来可以在浏览器里调试。
按Esc可以打开命令行,可以直接在命令行里交互式地敲js代码。
定义变量:
JavaScript和C语言不同的一点是变量类型转换很自由,这是优点也是缺点,优点是不需要关注太多细节,缺点是会比较混乱,你可以用typeof+变量
来查看变量的类型。
由于每个变量的类型是可以变化的,因此没有用char或int这样的关键词来定义变量。
JavaScript定义变量的关键词只有三个:var,let,const。
const好理解,和C语言一样,定义一个之后无法修改的变量,类型和值都是固定的。
let和var相比有三点不同:
1:let不允许变量重复声明,var可以,当var定义重复变量名时,返回值为未超出作用域的最后一个。
//eg:
var a = 1;
function space(){
var a = 2;
console.log(a); //2
a = 3;
console.log(a); //3
}
space();
console.log(a); //1
//此代码中作用域以函数为边界。
2:var声明的变量会进行变量提升,let不会进行变量提升。(变量提升:把作用域内的定义语句提到作用域最前面)
3:var声明的全局变量会绑定到顶级对象上(浏览器会绑定到window上,node.js会绑定到global上),let不绑定。
其实,JavaScript的变量可以不声明直接使用,如果不使用var、let或const关键字而直接出现一个新变量,该变量将被隐式声明为全局变量。这意味着在任何地方都可以访问该变量,可能会影响到代码的其他部分,所以不推荐此做法。
输入输出:
初学JavaScript为了调试自己的想法和所学的知识,与计算机进行输入输出的交互是必要的。
三个函数:
prompt(); //相当于输入,在浏览器里打开一个对话框,可以返回你输入的字符串。
//当用户输入为数字或布尔类型时,一律返回string型,若想使类型不变,则需要进行类型转换。
//值得一提的是,在调用 prompt() 时,将暂停对 JavaScript 代码的执行,在用户作出响应之前,不会执行下一条语句。
input = prompt("input what you want:"); //括号内放一个字符串会在对话框中作为问题显示。
input = prompt("input what you want:","qwq"); //括号内放第二个字符串会把第二个字符串作为默认答案。
res = Boolean(prompt("true or false?")); //可以将你输入的字符串true转化为Boolean类型
res = Number(prompt("What's your age?")); //转化为数字。(Number和Boolean关键词首字母都是大写的)
console.log();
//在命令行里输出。
//按Esc显示命令行,可以看到程序运行结果。
//由于prompt和alert函数会打开网页的对话框,因此将暂停JavaScript代码的执行,因此命令行的输出结果会分段显示出来。
alert();
//将想要输出的结果放入括号,与console.log()不同的是它会把输出内容放入页面对话框,显示这个是来自某某网页的信息,然后点一下就消失了。
//因为点一下就消失,而且每次只能输出一项内容,所以代码中有多个想要输出的内容用console.log()更方便些。
一个特性:JavaScript每一个语句加分号是好习惯,如果不加,代码也会默认在每行的行尾加上一个分号。
数据类型:
Number:
//字面量:
123456789, +1234, -1234,
0b1010101, 0o1234567123, 0x1236789abcdef,
3.1415,
1e100, 1e-4, 100000000000000000000000000000000000000000000000000000000000,
Infinity, NaN,
//(C语言中八进制字面量不加o,js需要加o,js中也可以直接写作01234567,
// 但这个写法有歧义,如果数字中有8或9,解释器会把前面的0当前导零处理)
//浮点数也当做number处理了,js整数除法运算不会自动下取整,出现分数就以浮点数形式存储。
//js中Number的位数好像可以长到犯规,js会把特别大的数自动当做浮点数处理,爆long long的说法是不存在了。
//两个特殊数值:Infinity, NaN 使用typeof也会返回number
//关于两个特殊数值的有趣运算:
console.log(1/0); // Infinity
console.log(Infinity/1000000); // Infinity
console.log(Infinity ** 0); // 1
console.log(Infinity / 0); // Infinity (无穷大除以零还是无穷大)
console.log(Infinity-Infinity); // NaN
console.log(Infinity/Infinity); // NaN
console.log(1/Infinity); // 0
console.log(NaN+Infinity); // NaN
//由此可见,Infinity和数学中的无限大运算方式一致,当遇到无法计算准确值的时候,会返回NaN类型,C++似乎把Infinity也归类为NaN了。
//NaN由于无精确值,几乎所有与其的Number类型运算都会返回NaN,但是也有一个例外:任何Number的0次幂都是1。
console.log(NaN ** 0); // 1
//未定义运算会返回NaN,因此字符串乘除或减一个number也会得到NaN
console.log("qwq" / 2); // NaN
console.log("qwq" + 2); // qwq2
console.log(NaN + "qwq"); // NaNqwq (这是把NaN转化成字符串了)
console.log("4" / 3); // 1.333333 (乘除减运算会把字符串变Number,如果变化失败则为NaN)
console.log("4" + 2); // 42 (加法一律变string)
console.log("Infinity" / 2); // Infinity
console.log("infinity" / 2); // NaN (区分大小写)
//类型转化:
Number("4.5"); // 4.5
Number("4.5.6"); // NaN
Number("1+2"); // NaN (如果是String类型的转化应当是只能认清字面量,无法在引号中进行计算)
BigInt:
JavaScript中大于\(2^{53}\)的数值会有精度问题,想要计算高精度的数字就不能使用Number类型。
//字面量:
12345678912345678912345678n,
//BigInt的字面量只有一种:大整数后面加一个n。
let qwq = 1234n;
let qwq = BigInt(true);
let qwq = BigInt(1234);
let qwq = BigInt("1234"); //字面量表示,和Boolean,Number,String类型的转化
//其中要注意number类型转化时有精度误差:
let qwq = BigInt(1000000000000000000000000000000000000000000000);
console.log(qwq); //999999999999999929757289024535551219930759168n
let num = Number(qwq);
console.log(num); //1e45
//计算:
console.log(1234n + 2); // 会报错,大整数只能加大整数
console.log(2n > 1); //true 但是比较的话,大整数可以和Number比
console.log(1n == 1); //true 可以认为与Number类型一级相等
console.log(1234n + 1234n); //2468n 输出值仍为大整数字面量,也就是说末尾带n
console.log(5n / 2n); //2 大整数和Number类型不同,由于是类int整数运算所以下取整
//转化为Boolean类型时,除0n以外一律为true
String:
//三种表示方法:
let str1 = "String1";
let str2 = 'String2';
let str3 = `you can add ${str1} and ${str2}`;
//${}不仅能套字符串,合法的运算都可以放入,最后返回值转化为String类
let str4 = `${1+2}`;
console.log("qwq1234" + 3); // qwq12343
console.log("qwq1234" - 4); // NaN (字符串运算只有加,没有乘除减,会默认变为NaN)
console.log("qwq"-"q"); // NaN (未定义的String运算也会变成NaN,但是此处的NaN不是String类型,依旧是number类型)
console.log("qwq"-"q"+"QAQ"); // NaNQAQ 有趣呐。。。从左到右算
let str5 = `line1
line2
line3`;
let str6 = "line1\nline2\nline3"; //用``来表示字符串甚至支持中间换行
//特殊字符:
\n //一般换行
\r //非windows系统中的换行,windows中写作\r\n
\` \' \" \\ //就是本人
\t //制表符
\b, \f, \v //退格,换页,垂直标签
\x** //Unicode 字符
\u**** //UTF-16 编码
\u{X…XXXXXX} //UTF-32 编码 \u在失配时会报错
Boolean:
//Boolean类型有两个字面量,也是所有的取值:
true, false,
//做比较和逻辑运算时返回值一律为Boolean类型
null
null, //是个字面量
let wo = null;
console.log(wo); //null
console.log(wo+wo); //0
console.log(wo*123); //0
console.log(wo+123); //123 神奇的运算,似乎在Number运算下会自动转化成0
console.log(wo || 123); //123 在逻辑运算下为false
console.log(typeof wo); //object 这是官方承认的一个错误qwq,我们不把null理解成对象类型
undefined:
undefined, //也是个字面量
let wo = undefined;
console.log(typeof wo); //undefined 与null一样,都是自成一种类型
let wo;
console.log(wo); //undefined 未赋值即为undefined
console.log(Number(undefined)); //NaN undefined转化为Number就是NaN
console.log(Number(null)); //0 null转化为Number是0
Object:
对象类型,除此类型之外所有类型都称为原始类型。对象类型类似与结构体。
Symbol:
类型用于创建对象的唯一标识符, 也算一种原始数据类型。
除了上述八种数据类型,typeof 还可以有另一个结果,叫function,自定义的函数和原有的alert等函数都是function。
typeof Number; //function 有趣的是Number也算function,因为Number()是转化类型的函数
typeof Number(); //number 与上一个不同,这个是返回值的type
typeof console; //object
typeof console.log; //function