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
posted @ 2023-07-23 01:03  maple276  阅读(26)  评论(0编辑  收藏  举报