❶ javascript 有几种数据类型
Javascript的数据类型有:
1. Number 数字类型
2. String 字符串类型
3. Boolean 布尔类型
4. Function 函数
5. Object 对象
6. Null
7. Undefined 没有定义类型
ECMAScript中有5中简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number和String。还有1中复杂的数据类型————Object,Object本质上是由一组无序的名值对组成的。
其中Undefined、Null、Boolean、Number都属于基本类型。Object、Array和Function则属于引用类型,String有些特殊,具体的会在下面展开分析。
变量
ECMAScript中用var关键字来定义变量,因为js是弱类型的,所以无法确定变量一定会存储什么值,也就不知道变量到底会是什么类型,而且变量的类型可以随时改变。
这就是ECMAScript是松散类型的来由,所谓松散类型就是可以用来保存任何类型的数据。
ps:
es6中新增了let命令来声明变量、const命令声明一个只读的常量。
let的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
const一旦声明,常量的值就不能改变。
关于let、const这里不做展开讨论,可以参考阮一峰 - ECMAScript 6 入门
typeof 操作符
由于js中的变量是松散类型的,所以它提供了一种检测当前变量的数据类型的方法,也就是typeof关键字.
通过typeof关键字,对这5种数据类型会返回下面的值(以字符串形式显示)
undefined---------- 如果值未定义Undefined
boolean---------- 如果这个值是布尔值Boolean
string---------- 如果这个值是字符串String
number---------- 如果这个值是数值类型Number
object---------- 如果这个值是对象或nullObject
需要注意的是typeof null返回为object,因为特殊值null被认为是一个空的对象引用。
Undefined
Undefined类型只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。不过,一般建议尽量给变量初始化,但是在早期的js版本中是没有规定undefined这个值的,所以在有些框架中为了兼容旧版浏览器,会给window对象添加undefined值。
window['undefined'] = window['undefined'];
//或者
window.undefined = window.undefined;
Null
Null类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null时会返回object的原因。
var car = null;
console.log(typeof car); // "object"
如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其他值。这样一来,只要直接检测null值就可以知道相应的变量是否已经保存了一个对象的引用了。
例如:
if(car != null){
//对car对象执行某些操作
}
实际上,undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true。
console.log(undefined == null); //true
尽管null和undefined有这样的关系,但它们的用途完全不同。无论在什么情况下都没有必要把一个变量的值显式地设置为undefined,可是同样的规则对null却不适用。换句话说,只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值。这样做不仅可以体现null作为空对象指针的惯例,而且也有助于进一步区分null和undefined。
Boolean
该类型只有两个字面值:true和false。这两个值与数字值不是一回事,因此true不一定等于1,而false也不一定等于0。
虽然Boolean类型的字面值只有两个,但JavaScript中所有类型的值都有与这两个Boolean值等价的值。要将一个值转换为其对应的Boolean值,可以调用类型转换函数Boolean(),例如:
var message = 'Hello World';
var messageAsBoolean = Boolean(message);
在这个例子中,字符串message被转换成了一个Boolean值,该值被保存在messageAsBoolean变量中。可以对任何数据类型的值调用Boolean()函数,而且总会返回一个Boolean值。至于返回的这个值是true还是false,取决于要转换值的数据类型及其实际值。下表给出了各种数据类型及其对象的转换规则。
数据类型
转换为true的值
转换为false的值
Boolean true false
String 任何非空的字符串 ""(空字符串)
Number 任何非0数值(包括无穷大) 0和NAN
Object 任何对象 null
Undefined 不适用 undefined
var message = 'Hello World';
if(message)
{
alert("Value is true");
}
运行这个示例,就会显示一个警告框,因为字符串message被自动转换成了对应的Boolean值(true)。由于存在这种自动执行的Boolean转换,因此确切地知道在流控制语句中使用的是什么变量至关重要。
ps:使用!!操作符转换布尔值
!!一般用来将后面的表达式强制转换为布尔类型的数据(boolean),也就是只能是true或者false;
对null与undefined等其他用隐式转换的值,用!操作符时都会产生true的结果,所以用两个感叹号的作用就在于将这些值转换为“等价”的布尔值;
var foo;
alert(!foo);//undifined情况下,一个感叹号返回的是true;
alert(!goo);//null情况下,一个感叹号返回的也是true;
var o={flag:true};
var test=!!o.flag;//等效于var test=o.flag||false;
alert(test);
这段例子,演示了在undifined和null时,用一个感叹号返回的都是true,用两个感叹号返回的就是false,所以两个感叹号的作用就在于,如果明确设置了变量的值(非null/undifined/0/”“等值),结果就会根据变量的实际值来返回,如果没有设置,结果就会返回false。
还有其他的小技巧,可以参考这12个JavaScript技巧
Number
这种类型用来表示整数和浮点数值,还有一种特殊的数值,即NaN(非数值 Not a Number)。这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。例如,在其他编程语言中,任何数值除以0都会导致错误,从而停止代码执行。但在JavaScript中,任何数值除以0会返回NaN,因此不会影响其他代码的执行。
NaN本身有两个非同寻常的特点。首先,任何涉及NaN的操作(例如NaN/10)都会返回NaN,这个特点在多步计算中有可能导致问题。其次,NaN与任何值都不相等,包括NaN本身。例如,下面的代码会返回false。
alert(NaN == NaN); //false
String
String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由单引号(')或双引号(")表示。
String类型的特殊性
string类型有些特殊,因为字符串具有可变的大小,所以显然它不能被直接存储在具有固定大小的变量中。由于效率的原因,我们希望JS只复制对字符串的引用,而不是字符串的内容。但是另一方面,字符串在许多方面都和基本类型的表现相似,而字符串是不可变的这一事实(即没法改变一个字符串值的内容),因此可以将字符串看成行为与基本类型相似的不可变引用类型
Boolean、Number、String 这三个是Javascript中的基本包装类型,也就是这三个其实是一个构造函数,他们是Function的实例,是引用类型,至于这里的String与以上说的String是同名,是因为其实上文说的String是指字符串,这里的String指的是String这个构造函数,上面那么写,是为了更好的理解,因为Javascript是松散类型的。我们可以看下String实例化的例子:
var name = String("jwy");
alert(typeof name);//"object"
var author = "Tom";
alert(typeof name);//"string"
至于author这个会有length,substring等等这些方法,其实是String这里的方面,string只是String的一个实例,类似于C#中的String,和string,只不过这里特殊一点。
注意,typeof 变量 如果值是"string" 的话,也就是这个变量是字符串,在Javascript中,字符串是基本类型,而在C#或Java中,字符串是引用类型,但是Javascript中的String是引用类型,因为它是Javascript中定义好的基本包装类型,在C#中,String跟string其实是一样的。
是不是有点绕?具体的引用类型和值类型的解析看这里javascript的基本类型和引用类型
来源:www.cnblogs.com/phillyx/p/5603738.html
❷ js常用的数据类型有哪些
js基本的数据类型 :数字类型,字符串型,布尔型,undefined,null ,对象类型,数组
1、数字类型(Number)
只有一种数字类型,数字 可以是小数 ,也可以的整数
以0开头 默认使用8进制来表示我的这个数字
以0x开头 默认使用16进制来表述我的这个数字
如果以-开头 默认以负数
如果我带有e:以科学计数法来解析我的这个数字
2、字符串型(string)
字符串是存储字符的变量,用来表示文本的数据类型,程序中的字符串是包含单引号/双引号的,由单引号来界定我双引号中包含的字符串 反过来
es6模板字符串("`")
3、布尔类型(boolean)
一般是用在流程控制语句中,字符串和数字类型都是无穷多个,然而我们的布尔数据类型只有两个:true 和 false
这两个个值一般用于说明某个事物是真或者假
js一般用布尔类型来比较所得到的结果
4、null(空)
关键字null是一个特殊的值,它表示变量为空值,用来定义空的或者是不存在的引用。
如果试图去引用一个没有定义的值,就会返回一个null。
这里注意一点:null并不等于"" 或者0
5、undefined(未定义)
这个值表示变量不含有值,没有定义的值,或者被定义了一个不存在的属性值
❸ javascript里面的数据类型有哪些
一、六个基础数据类型:
字符
数字
布尔
对象
null
undefined
二、其中对象数据类型常用的又有:
数组
函数
正则表达式
日期
普通意义的数组
注:ES6 又新增了第七种 Symbol 类型
❹ JS基础回顾-数值-IEEE754
数组的索引按照32位且无符号定点整数存储,也就是说数组索引最大值为 2 32 ,而数组以0开始,所以实际最大值为2 32 - 1
对于 & | ^ ~ 以后单独再说,主要说明 <<, >>, >>>
ECMA相关位运算说明
完整的位运算步骤
js能精确计算(运算结果)的数值范围是 [-2 53 , +2 53 ]
js能表示的纯整数数值范围是 [-1.8x10 308 , +1.8x10 308 ]
js能表示的纯小数数值范围是 [ -5x10 -324 , -1) ∪ (+1, 5x10 -324 ]
IEE754标准就和js中的正则表达式,unicode编码一样,他不是js特有的东西的,而是一种国际上通用规范,
目的其一,方便;
目的二,使程序可移植性强。
(在js中定义的数值,解释器会帮我们把值转化为IEEE754标准的64位浮点型,如果是位运算,解释器会把值定义为32位整型)
了解他之前,先看一个示例
那么,我们能不能创造出一种,利用有限的8位机器数,尽可能多的解决上述问题的方法呢?
假设,机器位为8,有如下的一段2进制编码:
符号位 :0表示正值, 1表示负值;
指数位 :就是我们理解的平方数,在这里由于是2进制,所以,指数位的010暂且表示为 2 010 = 2 2 ,且指数的表示范围为0 ~ 7之间。(一会说这样做的问题)
数值位 :就是我们要表示的真实的值的部分,但是,这里的1010并不是我们通常理解的10进制 的10,因为我们要在这解决上述定点数的问题,
那么,我们怎么设计才能让一条整数,小数共存的数据表示在一个硬件中呢?且简单易懂?
但是,以(0.)作为约定的数值位默认头是有问题的,比如:
真值 +0.001010 以我们自定义规则转换成的二进制为,
0000 0010 ,因为机器位数为8,超过的8位要舍去,10就被丢掉了,损失了精度且保留了多余的,没有意义的0 。
这就引出了我们要解决的问题4
看来,我们现在需要对规则进行一些修改,我们尝试以(1.)作为约定的数值位默认头,还是以真值 +0.001010为例 ,那么这个真值可以改写为
1.010 x 2 -3 == 1.010 x 2 -011
这回可操蛋了,因为之前我们约定的指数部分的表示范围是0 ~ 7,这个-3可怎么办呢,聪明的你肯定想到了,何不把指数位置的第一位也规定为符号位呢?这不就可以表示正负数了吗,没错,是可以满足需求,但是,多一个符号位的判断会增加机器的运算复杂度负担,那么可以用补码啊?没错,但是,如果通过指数进行数值比较的时候(注意:在对两个值进行判断的时候,例如 3 > 4,计算机浮点运算器会对 3 和 4 对应的64位浮点数指数位数值进行比较,如果不相等,直接返回true或false,如果想等,再进行数值位的比较),又要增加负担,有没有更好的办法呢?
可推理出
真值 +0.001010 == 1.010 x 2 -3 == 1.010 x 2 -011
得指数真实表示的值为 -011 + 偏移值 011 == 000
真值 +0.001010 的自定义2进制编码值为
0000 0100
经过以上的求证,得到新的8位机器数浮点数约定如下:
所以,图1-1使用我们新约定的浮点数规则解码,得到:
1.1010 x 2 010-011=-1 == 0.11010
+0.11010 == 0.9140625
先说间隙值
再说数值范围
我们再回过头来看看IEEE754,由于js使用的是IEEE754双精度浮点格式(64 位),所以我们就针对64位说明。其实,和我们上面自己胡编乱造的规则基本一样,
IEEE754双精度浮点格式
符号位1,指数位11,数值位52,偏移值 2 11-1 - 1 == 1023
现在,我们可以自己证明
因为数值位是52位,加上约定的隐藏头1. 那么就是 53位,超出的部分舍弃,所以就是精度损失
但严谨来说,应该是不包含小数
已经证明过
我们先把0.1 和 0.2 转化为2进制
很明显,0.1 和 0.2 都无法用2进制精准表示,呈现出的是无限循环。
我们看一个实例,来看看IEEE如何做舍入处理的
(例子是IEEE754单精度浮点格式(32 位),没找到64位的,自己懒得算了。。不过可以说明问题)
0.1被IEEE754双精度浮点数舍入处理后的值为
0.
0.2被IEEE754双精度浮点数舍入处理后的值为
0.
0.1 和 0.2 在转换后都被进位了,所以实际值,比真实值要大一点点,所以0.1+0.2比0.3略大,暂且这么来理解,因为浮点数的运算比定点数要麻烦,又由于10.1假期结束,至此一阶段笔记到此结束,之后的二阶段再补浮点数运算的笔记
参考资料
计算机组成原理
http://c.biancheng.net/view/314.html
https://www.hu.com/question/21711083
https://blog.csdn.net/weixin_40805079/article/details/85234878
❺ 涓轰粈涔圝S涓鏁板肩被鍨嬪凡缁忓彲浠ヤ娇鐢∟umber鏂规硶锛岃繕瑕佸紩鍏Number瀵硅薄姒傚康锛
JavaScript涓锛屾暟鍊肩被鍨嬫湁涓ょ嶈〃绀烘柟寮忥細鐩存帴閲忓拰Number瀵硅薄銆傝繖涓ょ嶈〃绀烘柟寮忓湪澶у氭暟鎯呭喌涓嬫槸绛変环鐨勶紝浣嗘槸瀹冧滑鏈変竴浜涢噸瑕佺殑鍖哄埆銆
鐩存帴閲忥紙涔熺О涓哄師濮嬪硷級琛ㄧず涓涓鏁板煎父閲忥紝瀹冪洿鎺ュ啓鍦ㄤ唬鐮佷腑锛屼緥濡10鎴栬3.14銆傜洿鎺ラ噺鏄涓嶅彲鍙樼殑锛屽畠浠鏄鍘熷嬬被鍨嬬殑鍊硷紝涓嶈兘璋冪敤鏂规硶锛屽彧鑳借繘琛屽熀鏈鐨勮繍绠椼
Number瀵硅薄琛ㄧず涓涓鏁板硷紝浣嗘槸瀹冩槸涓涓瀵硅薄锛岃屼笉鏄鍘熷嬬被鍨嬬殑鍊笺侼umber瀵硅薄鍙浠ヨ皟鐢ㄦ柟娉曟潵鎵ц屾洿楂樼骇鐨勬搷浣滐紝姣斿傝浆鎹涓哄瓧绗︿覆銆佹瘮杈冨ぇ灏忕瓑銆備絾鏄锛岀敱浜嶯umber瀵硅薄鏄鍙鍙樼殑锛屾墍浠ュ畠鐨勬ц兘瑕佹瘮鐩存帴閲忓樊涓浜涖
鎵浠ワ紝閫氬父鏉ヨ达紝鎴戜滑搴旇ヤ紭鍏堜娇鐢ㄧ洿鎺ラ噺鏉ヨ〃绀烘暟鍊硷紝鍙鏈夊湪闇瑕佷娇鐢∟umber瀵硅薄鐨勬柟娉曟椂鎵嶄娇鐢∟umber瀵硅薄銆
瀵逛簬涓婇潰鐨勪緥瀛愶紝n1鍜宯2涓よ呴兘鍙浠ヨ皟鐢╰oString()鏂规硶鏉ュ皢鏁板艰浆鎹涓哄瓧绗︿覆锛屼絾鏄痭2鏄涓涓狽umber瀵硅薄锛屾墍浠ュ畠鍙浠ヨ皟鐢ㄦ洿澶氱殑鏂规硶銆備緥濡傦紝浣跨敤Number.isInteger()鏂规硶妫鏌ヤ竴涓鏁板兼槸鍚︿负鏁存暟鏃讹紝n1鏄鐩存帴閲忥紝鎵浠ュ畠鍙浠ョ洿鎺ヤ紶鍏`Number
鍙﹀栵紝鐢变簬Number.isInteger()鏂规硶鏄疦umber瀵硅薄鐨勪竴涓闈欐佹柟娉曪紝鑰屼笉鏄瀹炰緥鏂规硶锛屾墍浠ュ畠鏃犳硶鐩存帴鍦∟umber瀵硅薄瀹炰緥涓婅皟鐢ㄣ備緥濡傦紝鍦ㄤ笂闈㈢殑渚嬪瓙涓锛孨umber.isInteger(n1)杩斿洖true锛屽洜涓簄1鏄涓涓鐩存帴閲忥紝瀹冨彲浠ョ洿鎺ヤ紶鍏Number.isInteger()鏂规硶锛涜孨umber.isInteger(n2)杩斿洖false锛屽洜涓簄2鏄涓涓狽umber瀵硅薄瀹炰緥锛岃屼笉鏄鐩存帴閲忥紝瀹冧笉鑳界洿鎺ヤ紶鍏Number.isInteger()鏂规硶銆
鎬讳箣锛岀洿鎺ラ噺鍜孨umber瀵硅薄涓よ呴兘鍙浠ヨ〃绀烘暟鍊硷紝浣嗘槸瀹冧滑鏈変竴浜涢噸瑕佺殑鍖哄埆锛屽簲璇ユ牴鎹瀹為檯鎯呭喌鏉ラ夋嫨浣跨敤鍝绉嶆柟寮忋傞氬父鏉ヨ达紝鎴戜滑搴旇ヤ紭鍏堜娇鐢ㄧ洿鎺ラ噺鏉ヨ〃绀烘暟鍊硷紝鍙鏈夊湪闇瑕佷娇鐢∟umber瀵硅薄鐨勬柟娉曟椂鎵嶄娇鐢∟umber瀵硅薄銆
❻ 简述一下javascript定义数据类型和方法与java的异同
1、javascript是弱类型语言,定义变量时用var关键字(可选)且不需要也不能指定变量的类型,而java是强类型语言,定义任何变量时必须指定其类型,否则正销无法通过编译;
2、javascript定义函数(或函数直接量)时要使用function关键字,java不需要;
下面举例说明:
1、定义变量的方法
javascript
var 变量名悉清让=初始值(可选);或
变量名=初睁局始值(可选);如
var str="你好";
d=new Date();
java
变量修饰符(public、protected、private、static、final的有效组合) 变量类型 变量名=初始值(可选);如
public static final int Count=100;
2、定义函数的方法
javascript
function 函数名(参数列表(可选))
{
}
或
var(可选) 变量名=function(参数列表(可选))
{
}如
function f(a,b,c)
{
}
或
f2=function()
{
}
java
函数修饰符(public、protected、private、static、final、abstract的有效组合) 返回类型 函数名(参数列表(可选))
{
}(非abstract函数)
或
函数修饰符(public、protected、abstract的有效组合) 返回类型 函数名(参数列表(可选));如
public static void f(int a,String msg)
{
}或
public abstract int f2(float f,char c);
❼ javascript数据类型有哪些
JavaScript 字符串
字符串是存储字符(比如 "Bill Gates")的变量。
JavaScript 数字
JavaScript 只有一种数字类型。数专字可以带小数点,也可以不带:属
JavaScript 布尔
布尔(逻辑)只能有两个值:true 或 false。
JavaScript 数组
下面的代码创建名为 cars 的数组:
JavaScript 对象
对象由花括号分隔。在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义。属性由逗号分隔:
Undefined 和 Null
Undefined 这个值表示变量不含有值。
可以通过将变量的值设置为 null 来清空变量。