记得叫大红大厨 發表於 2019-11-26 13:25:00

Dart和JavaScript对比小结

<p>作为一名web前端来入门dart,新语言和我们熟悉的js有所差异,写dart的过程中容易受到原有思维的影响,这里把dart和js做一个对比总结,方便查找和熟悉。</p>
<p>&nbsp;</p>
<h2 id="LyqUp">变量声明</h2>
<ol start="1">
<li><strong>var 关键字</strong></li>
</ol>
<p>dart和js都支持var关键字,<span class="lake-fontsize-11">使用 var 关键词进行声明的时候,dart 会自动推断出 当前变量的类型,如果在变量声明的时候没有进行赋值,那么该类型就是动态的,类似于 TS 的 any。在类型推断上跟&nbsp;<code>TypeScript</code><span class="lake-fontsize-11">&nbsp;是一致的。</span></span></p>
<p><strong>众所周知,JavaScript 是一门弱类型的语言,而 Dart 是强类型的语言</strong></p>
<p>但dart也支持一些弱类型,Dart 中弱类型有<code>var</code>,&nbsp;<code>Object</code>&nbsp;以及<code>dynamic</code></p>
<p>大家在学习dart的过程中,可能有疑问:同为弱类型,<code>var</code>, <code>Object</code> 以及<code>dynamic</code><strong>有什么区别?</strong></p>
<p>(1) var 初始可定义,&nbsp;如果有初始值,那么其类型将会被锁定,定义之后不可改变类型</p>
<p>(2) Object&nbsp;动态任意类型,编译阶段检查类型</p>
<p>(3) dynamic 动态任意类型,编译阶段不检查类型</p>
<p><code>var</code> 初始化确定类型后不可更改类型, <code>Object</code> 以及<code>dynamic</code> 可以更改类型</p>
<p><code>Object</code> 编译阶段检查类型, 而 <code>dynamic</code> 编译阶段不检查类型</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 同样在声明的时候类型</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> a = 'defalut'<span style="color: rgba(0, 0, 0, 1)">;
Object b </span>= 'defalut'<span style="color: rgba(0, 0, 0, 1)">;
dynamic c </span>= 'defalut'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 编译时不会检查数据类型</span>
<span style="color: rgba(0, 0, 0, 1)">
a </span>= 123<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">出现报错提示A value of type 'int' can't be assigned to a variable of type 'String'</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">Try changing the type of the variable, or casting the right-hand type to 'String'</span>
<span style="color: rgba(0, 0, 0, 1)">
b </span>= 123<span style="color: rgba(0, 0, 0, 1)">;
c </span>= 123<span style="color: rgba(0, 0, 0, 1)">;

b.foo(); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 出现报错提示The method 'foo' isn't defined for the class 'Object'.</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> Try correcting the name to the name of an existing method, or defining a method </span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> named 'foo'.dart(undefined_method)</span>
<span style="color: rgba(0, 0, 0, 1)">
c.foo(); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 通过它定义的变量会关闭类型检查,这段代码静态类型检查不会报错,但是运行时会crash,</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 因为mic并没有foo()方法,所以建议大家在编程时不要直接使用dynamic</span></pre>
</div>
<ol start="2">
<li><strong>final 关键字&nbsp;&nbsp;</strong></li>
</ol>
<p>在学习dart 的过程中,很快就能接触到 final 关键字,大家会发现它和 const 其实很像,都是必须初始化,初始化后都是只读的,不可变</p>
<p>但此时可能又会发出灵魂疑问:<strong>final和const有啥区别?</strong></p>
<p>它们的区别在于,const比final更加严格。final只是要求变量在初始化后值不变,但通过final,我们无法在<strong>编译时(运行之前)</strong>知道这个变量的值;而const所修饰的是编译时常量,我们在编译时就已经知道了它的值。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 定义常量</span>
final a = 90<span style="color: rgba(0, 0, 0, 1)">;
static const b </span>= 90<span style="color: rgba(0, 0, 0, 1)">;

final c </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> DateTime.now(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 在编译时不知道他的值</span>
static const d = <span style="color: rgba(0, 0, 255, 1)">new</span> DateTime.now(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Const variables must be initialized with a</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> constant value.Try changing the initializer to be a constant </span></pre>
</div>
<ol start="3">
<li><strong>默认值</strong></li>
</ol>
<p>js中变量的初始值是undefined</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> a
console.log(a) </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> undefined</span></pre>
</div>
<p>在 Dart 中,未初始化的变量拥有一个默认的初始化值:&nbsp;<code>null</code>。即便数字也是如此,因为在 Dart 中一切皆为对象,数字也不例外。要用final的话必须定义一个初始值</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> some;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> -&gt; null</span>
bool flag;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> -&gt; null</span>
<span style="color: rgba(0, 0, 255, 1)">int</span> number;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> -&gt; null</span>
String str;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> -&gt; null</span>
Object obj;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> -&gt; null</span>
final namic;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Error: must be initialized</span></pre>
</div>
<ol start="4">
<li><strong>类型判断</strong></li>
</ol>
<p>js用 typeof 来判断基本类型(字符串(string)、数值(number)、布尔值(boolean)、undefined),用 instanceof 来判断引用类型(Object对象Array数组Function函数)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> a = 0
<span style="color: rgba(0, 0, 255, 1)">var</span> b = '0'
<span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> c
</span><span style="color: rgba(0, 0, 255, 1)">var</span> d = <span style="color: rgba(0, 0, 255, 1)">true</span>

<span style="color: rgba(0, 0, 255, 1)">var</span> e =<span style="color: rgba(0, 0, 0, 1)"> {}
</span><span style="color: rgba(0, 0, 255, 1)">var</span> f =<span style="color: rgba(0, 0, 0, 1)"> []
</span><span style="color: rgba(0, 0, 255, 1)">var</span> g = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(){}

</span><span style="color: rgba(0, 0, 255, 1)">typeof</span> a <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> number</span>
<span style="color: rgba(0, 0, 255, 1)">typeof</span> b <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> string</span>
<span style="color: rgba(0, 0, 255, 1)">typeof</span> c <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> undefined</span>
<span style="color: rgba(0, 0, 255, 1)">typeof</span> d <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> boolean</span>
<span style="color: rgba(0, 0, 0, 1)">
e </span><span style="color: rgba(0, 0, 255, 1)">instanceof</span> Object <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> true</span>
f <span style="color: rgba(0, 0, 255, 1)">instanceof</span> Array <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> true</span>
g <span style="color: rgba(0, 0, 255, 1)">instanceof</span> Function <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> true</span></pre>
</div>
<p>dart 用关键字 is 来进行类型判断,返回布尔值,ps: assert 生产环境忽略,debug模式开启</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> a = 123<span style="color: rgba(0, 0, 0, 1)">;
print(a is dynamic);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> true</span>
assert(a is Object);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> true</span></pre>
</div>
<ol start="5">
<li><strong>类型转换</strong></li>
</ol>
<p>js除了自动类型转换之外,还有类型转换的方法</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> json和字符串互相转换</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> obj = {a:'2.2'<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 0, 255, 1)">var</span> str = JSON.stringify(obj) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> "{"a":"2.2"}"</span>
JSON.parse(str) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> {a: "2.2"}</span>
Number(obj.a) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 2.2 // 转成number类型</span>
parseInt(obj.a) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 2 转成int类型</span></pre>
</div>
<p><span class="lake-fontsize-11">在实际项目中,后台接口往往会返回一些结构化数据,如JSON、XML等,可以通过<code>dart:convert</code><span class="lake-fontsize-11">中内置的JSON解码器json.decode() 来进行转换。</span></span></p>
<p><span class="lake-fontsize-11">通过json.decode() 将JSON字符串转为List/Map的方法比较简单,它没有外部依赖或其它的设置,对于小项目很方便。但当项目变大时,这种手动编写序列化逻辑可能变得难以管理且容易出错,<span class="lake-fontsize-11">JSON.decode()仅返回一个<code>Map&lt;String, dynamic&gt;</code><span class="lake-fontsize-11">,这意味着我们直到运行时才知道值的类型。 通过这种方法,我们失去了大部分静态类型语言特性:类型安全、自动补全和最重要的编译时异常。</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 内连序列化JSON 使用 dart:convert手动序列化JSON</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> JSON.decode方法来解码JSON</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">一个JSON格式的用户列表字符串</span>
String jsonStr='[{"name":"Jack"},{"name":"Rose"}]'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将JSON字符串转为Dart对象(此处是List)</span>
List items=<span style="color: rgba(0, 0, 0, 1)">json.decode(jsonStr);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">输出第一个用户的姓名</span>
print(items["name"]);</pre>
</div>
<p><span class="lake-fontsize-11">可以通过引入一个简单的模型类(Model class)来解决前面提到的问题</span></p>
<p><span class="lake-fontsize-11">这样,调用代码现在可以具有类型安全、自动补全字段(name和email)以及编译时异常。如果我们将拼写错误字段视为<code>int</code><span class="lake-fontsize-11">类型而不是<code>String</code><span class="lake-fontsize-11">, 那么我们的代码就不会通过编译,而不是在运行时崩溃。</span></span></span></p>
<p><span class="lake-fontsize-11">官方推荐的json_serializable package<span class="lake-fontsize-11">包&nbsp;</span></span></p>
<p>操作方法:JSON 转dart Model 类&nbsp;</p>
<h2 id="va3WA">布尔值</h2>
<p>&nbsp;</p>
<p><span class="lake-fontsize-11">在js中,<strong><span class="lake-fontsize-11">自动类型转换</span></strong><span class="lake-fontsize-11">,使用判断的时候空字符串,0,null,undefined都会被转换为false</span></span></p>
<div id="QvRNa" data-card-type="block" data-lake-card="codeblock" data-card-value="data:%7B%22mode%22%3A%22javascript%22%2C%22code%22%3A%22var%20flag%20%3D%201%20%3D%3D%20'1'%3B%5Cnconsole.log(flag)%3B%20%20%2F%2F%20-%3E%20true%22%2C%22id%22%3A%22QvRNa%22%7D">
<div class="lake-codeblock-content">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> flag = 1 == '1'<span style="color: rgba(0, 0, 0, 1)">;
console.log(flag);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> -&gt; true</span></pre>
</div>
<p><span class="lake-fontsize-11">Dart是强类型语言,不会进行自动类型转换,在判断的时候就要注意了</span></p>
<div class="cnblogs_code">
<pre>bool flag = 1 == '1'<span style="color: rgba(0, 0, 0, 1)">;
print(flag);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> -&gt; false</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 检查是否为空字符串。</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> fullName = ''<span style="color: rgba(0, 0, 0, 1)">;
assert(fullName.isEmpty);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 检查是否小于等于零。</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> hitPoints = 0<span style="color: rgba(0, 0, 0, 1)">;
assert(hitPoints </span>&lt;= 0<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 检查是否为 null。</span>
<span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> unicorn;
assert(unicorn </span>== <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 检查是否为 NaN。</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> iMeantToDoThis = 0 / 0<span style="color: rgba(0, 0, 0, 1)">;
assert(iMeantToDoThis.isNaN);</span></pre>
</div>
<h2 id="dqNjm">字符串</h2>
<p>&nbsp;</p>
<p>js</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> str = 'string' <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 单引号</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> str2 = "string2" <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 双引号</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> str3 = 'test ' + "string" <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 字符串拼接</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> str4 = `string3${str2}` <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 反引号-变量字符串</span>
<span style="color: rgba(0, 0, 0, 1)">
str.length </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 6 字符串长度</span>
str.charAt(1) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> s 返回给定位置的字符</span>
str.charcodeAt(1) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 返回给定位置字符的字符编码</span>
str <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">s ie8+</span>
<span style="color: rgba(0, 0, 0, 1)">
str.concat(</span>'a') <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">stringa 可以接受任意多个参数拼接成新的字符串,但不会改变原字符串</span>
str.slice(0,3) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">str 截取字符串</span>
str.substring(3) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ing 截取字符串</span>
str.substr(0,1) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">s 截取字符串</span>
str.indexOf('s') <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 0 可接受两个参数,找到返回位置,找不到返回-1</span>
str.lastIndexOf('t') <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1 从数组的末尾开始查找</span>
str.trim() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">删除前置和后缀的空格 返回的是字符串的副本,原始字符串不变</span>
<span style="color: rgba(0, 0, 0, 1)">
str.toLowerCase() </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">转小写</span>
str.toUpperCase() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">转大写</span>
str.toLocaleLowerCase() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">string 转小写,针对地区的方法</span>
str.toLocaleUpperCase() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">STRING 转大写,针对地区的方法</span>
<span style="color: rgba(0, 0, 0, 1)">
str.match(</span>'s') <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ["s", index: 0, input: "string", groups: undefined]</span>
str.search('s') <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">0 接受一个正则,返回字符串中第一个匹配项的索引,没有返回-1</span>
str.replace('s','c') <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ctring 替换字符串,可正则匹配</span>
str.split() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">["string"] 分割字符串,并返回一个数组。</span></pre>
</div>
<p>dart</p>
<div class="cnblogs_code">
<pre>String a = 'string' <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 单引号 </span>
String b = "string" <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 双引号 </span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 多行字符串</span>
String c = '''<span style="color: rgba(0, 0, 0, 1)">string
huanhang</span>'''
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 使用前缀 r 创建 raw string,字符串内不会进行转义</span>
String d = r'haha \n breakLine' <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 不换行,输出haha \n breakLine</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 使用变量$name或${name}都可以,前一种方法的后面不能直接跟字符串,要用空格或者逗号等方式隔开</span>
String name = 'hello'<span style="color: rgba(0, 0, 0, 1)">;
assert(</span>'$name string'); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> hello string</span>
assert('${name} string'); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> hello string</span>
assert(name.length); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 6 字符串长度</span>
assert(name.isEmpty) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> false 判断是否为空</span>
assert(name.isNotEmpty) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> true 是否不为空</span>
assert(name.substring(0, 2)) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> he 字符串切割</span>
assert(name.substring(3)) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> lo 从指定index至末尾</span>
String e = "a,b,,"<span style="color: rgba(0, 0, 0, 1)">;
List</span>&lt;String&gt; a6 = e.split(",");<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 使用,分割,返回的是一个数组,同js </span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 查找并替换 相当于split 和 join</span>
String f = "a b,c"<span style="color: rgba(0, 0, 0, 1)">;
String g </span>= f.splitMapJoin(",",<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">查询“,”</span>
   onMatch: (Match match) { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 用匹配的值替换</span>
   <span style="color: rgba(0, 0, 255, 1)">return</span> "a"<span style="color: rgba(0, 0, 0, 1)">;
   }, onNonMatch: (String nonMatch) { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 用不匹配的值替换</span>
   <span style="color: rgba(0, 0, 255, 1)">return</span> "b"<span style="color: rgba(0, 0, 0, 1)">;
   });
assert(g);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">bab    a b,c=&gt;   bab</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 字符串判断</span>
String = 'aabbbcccc'<span style="color: rgba(0, 0, 0, 1)">;
assert(h.startsWith(</span>"aa")); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true startsWith以某某开始</span>
assert(h.startsWith("aa", 3)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">false 从index=3开始判断</span>
assert(h.endsWith("c")); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true endsWith 以xx结尾</span>
assert(h.contains("ab")); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true contains是否包含</span>
assert(h.contains("ac")); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">false</span>
assert(h.contains("ab", 3)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">false 从index=3开始判断</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 字符串替换</span>
String i = "stringing"<span style="color: rgba(0, 0, 0, 1)">;
assert(i.replaceAll(</span>"st","cc"));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ccringing 替换全部符合条件的</span>
assert(i.replaceFirst("ing", "ss"));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">strssing 只替换第一个符合条件的</span>
assert(i.replaceFirst("ing", "dd",5));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">stringdd 从index=5开始 替换第一个符合条件的</span>
assert(i.replaceRange(0, 3, "z"));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> zinging 范围替换 从0-3 含0不含3</span>
assert(i.replaceAllMapped("i", (Match match){<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">stryngyng 用方法返回值替换指定的字符串</span>
<span style="color: rgba(0, 0, 255, 1)">return</span> "y"<span style="color: rgba(0, 0, 0, 1)">;
}));
assert(i.replaceFirstMapped(</span>"i"<span style="color: rgba(0, 0, 0, 1)">, (Match match){
</span><span style="color: rgba(0, 0, 255, 1)">return</span> "333"<span style="color: rgba(0, 0, 0, 1)">;
},</span>5)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">string333ng 从index=5开始 用方法返回值替换指定的字符串</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 字符串查找</span>
Sting j = 'hello'<span style="color: rgba(0, 0, 0, 1)">
assert(j.indexOf(</span>'l')); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 2 从前往后找 返回第一个符合条件的index</span>
assert(j.lastIndexOf('l')); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 3 从后往前找 返回第一个符合条件的index</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 转换为大小写</span>
Stinrg k = 'aaBBcC'<span style="color: rgba(0, 0, 0, 1)">
assert(k.toLowerCase()); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> aabbcc</span>
assert(k.toUpperCase()); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> AABBCC</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 去除空格</span>
String l = " aab bcc "<span style="color: rgba(0, 0, 0, 1)">;
assert(l.trim()); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">aabbcc 去除左右空格</span>
assert(l.trimLeft()); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">aabbcc 去除左边空格</span>
assert(l.trimRight()); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> aabbcc去除右边空格</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 补齐长度 剩余位使用指定字符串替换</span>
String j = "111"<span style="color: rgba(0, 0, 0, 1)">;
assert(j.padLeft(</span>6));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 111 剩余3个位 默认使用""补齐</span>
assert(j.padRight(6,"c")); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">111ccc 剩余3个位 指定使用"c"</span>
assert(j.padRight(6,"dd")); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">111dddddd 剩余3个位 每个位指定使用"dd" 替换后总长度不是6</span>
assert(j.padLeft(2,"e"));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">111 如果指定长度小于原字符串长度 返回原字符串</span></pre>
</div>
<h2 id="LDkEv">对象</h2>
<p>&nbsp;</p>
<p>js</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> gifts =<span style="color: rgba(0, 0, 0, 1)"> {
</span>'first': 'partridge'<span style="color: rgba(0, 0, 0, 1)">,
</span>'second': 'turtledoves'<span style="color: rgba(0, 0, 0, 1)">
};
gifts.first </span>= 'hhh'
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Object.keys(obj) 返回对象的key组成的数组</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> Object.values(obj) 返回对象的value组成的数组</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> Object.assign() 可以将源对象复制到目标对象中</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> Object.entries(obj) 返回对象的key和value组成的数组</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> obj.hasOwnProperty() hasOwnProperty 方法判断对象中属性是否存在</span></pre>
</div>
<p>dart</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> gifts =<span style="color: rgba(0, 0, 0, 1)"> {
</span>'first': 'partridge'<span style="color: rgba(0, 0, 0, 1)">,
</span>'second': 'turtledoves'<span style="color: rgba(0, 0, 0, 1)">
};
</span><span style="color: rgba(0, 0, 255, 1)">var</span> gifts =<span style="color: rgba(0, 0, 0, 1)"> Map();
gifts[</span>'first'] = 'partridge'<span style="color: rgba(0, 0, 0, 1)">;
gifts[</span>'second'] = 'turtledoves';</pre>
</div>
<h2 id="ja2im">数组</h2>
<p>&nbsp;</p>
<p>js</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> list = ;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> list1 = ;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> list2 = ;

console.log(list.length) </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 3</span>
list1.concat(list2) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接两个或更多的数组,并返回结果。</span>
list.every(i=&gt;i&gt;3) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> false 检测数值元素的每个元素是否都符合条件。</span>
list.some(i=&gt;i&gt;3) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> true 检测数值元素是否有符合条件的值</span>
list.filter(i=&gt;i&gt;3)    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 检测数值元素,并返回符合条件所有元素的数组。</span>
list.find(i=&gt;i=3) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1 返回符合传入测试(函数)条件的数组元素。</span>
list.forEach() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 遍历数组</span>
list.join('') <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 12345 把数组的所有元素放入一个字符串。</span>
list.map(i=&gt;i+1) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 通过指定函数处理数组的每个元素,并返回处理后的数组。</span>
list.pop() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 5 删除数组的最后一个元素并返回删除的元素。</span>
list.push(8) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 5 向数组的末尾添加一个或更多元素,并返回新的长度。</span>
list.shift() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1 删除并返回数组的第一个元素。</span>
list.sort() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 排序</span>
list.toString() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1,2,3,4,5 把数组转换为字符串,并返回结果。</span>
list.unshift(8) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 向数组的开头添加一个或更多元素,并返回新的长度。</span>
list.reduce((curr, next) =&gt; curr + next); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 15 数组相加的总和</span></pre>
</div>
<p>dart</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> list = ;
assert(list.length </span>== 3<span style="color: rgba(0, 0, 0, 1)">);
assert(list[</span>1] == 2<span style="color: rgba(0, 0, 0, 1)">);

list[</span>1] = 1<span style="color: rgba(0, 0, 0, 1)">;
assert(list[</span>1] == 1<span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 同js</span>
list.forEach((i) =&gt; print(i)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 遍历数组</span>
list.map(i=&gt;i+1) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> </span>
list.sort((num1, num2) =&gt; num1 - num2); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 排序</span>
list.every(i=&gt;i&lt;5) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> true 用法同上</span>
list.reduce((curr, next) =&gt; curr + next); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 15 数组相加的总和</span>
<span style="color: rgba(0, 0, 0, 1)">
list.fold(</span>2,(curr, next) =&gt; curr + next);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 17 用法同reduce,有一个初始值</span>
list.contains(5) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> false 用于判断数组是否包含某个元素</span>
list.where((i) =&gt; i &gt; 2); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 返回数组中满足给定条件的元素集合</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> firstWhere() 返回数组中满足给定条件的第一个元素</span>
list.firstWhere((i) =&gt; i &gt; 2, orElse: () =&gt; <span style="color: rgba(0, 0, 255, 1)">null</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 3</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> singleWhere() 返回数组中满足给定条件的唯一一个元素,若有多个元素满足条件会抛出异常</span>
list.singleWhere((i) =&gt; i &lt; 2, orElse: () =&gt; <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
List arr </span>= ;
arr.take(</span>3).toList() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> take(n) 从数组里取 n 个元素</span>
arr.skip(4).toList() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> skip(n) 跳过数组中的 n 个元素</span>
arr.take(3).skip(2).take(1).toList() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> </span>
<span style="color: rgba(0, 0, 255, 1)">var</span> clonedArr = List.from(list); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> from 克隆一个数组</span>
<span style="color: rgba(0, 0, 0, 1)">print(clonedArr);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> arr1 = [, , ];
arr1.expand((item) </span>=&gt; item).toList(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> </span>
list.expand((item) =&gt; ).toList();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> </span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 当对每一项进行计算时类似于 map() </span>
list.map((item) =&gt; item * 8<span style="color: rgba(0, 0, 0, 1)">).toList();
list.add(</span>10); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 向数组中添加元素</span>
list.addAll(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 向数组中添加另一个数组的所有元素</span></pre>
</div>
<p>&nbsp;</p>
</div>
</div><br><br>
来源:https://www.cnblogs.com/leiting/p/11908532.html
頁: [1]
查看完整版本: Dart和JavaScript对比小结